Home | History | Annotate | Download | only in llvm-c
      1 /*===-- llvm-c/lto.h - LTO Public C Interface ---------------------*- C -*-===*\
      2 |*                                                                            *|
      3 |*                     The LLVM Compiler Infrastructure                       *|
      4 |*                                                                            *|
      5 |* This file is distributed under the University of Illinois Open Source      *|
      6 |* License. See LICENSE.TXT for details.                                      *|
      7 |*                                                                            *|
      8 |*===----------------------------------------------------------------------===*|
      9 |*                                                                            *|
     10 |* This header provides public interface to an abstract link time optimization*|
     11 |* library.  LLVM provides an implementation of this interface for use with   *|
     12 |* llvm bitcode files.                                                        *|
     13 |*                                                                            *|
     14 \*===----------------------------------------------------------------------===*/
     15 
     16 #ifndef LTO_H
     17 #define LTO_H  1
     18 
     19 #include <stdbool.h>
     20 #include <stddef.h>
     21 #include <unistd.h>
     22 
     23 #define LTO_API_VERSION 4
     24 
     25 typedef enum {
     26     LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F, /* log2 of alignment */
     27     LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,
     28     LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,
     29     LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,
     30     LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,
     31     LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,
     32     LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,
     33     LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,
     34     LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,
     35     LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,
     36     LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,
     37     LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,
     38     LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,
     39     LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,
     40     LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,
     41     LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,
     42     LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800
     43 } lto_symbol_attributes;
     44 
     45 typedef enum {
     46     LTO_DEBUG_MODEL_NONE         = 0,
     47     LTO_DEBUG_MODEL_DWARF        = 1
     48 } lto_debug_model;
     49 
     50 typedef enum {
     51     LTO_CODEGEN_PIC_MODEL_STATIC         = 0,
     52     LTO_CODEGEN_PIC_MODEL_DYNAMIC        = 1,
     53     LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2
     54 } lto_codegen_model;
     55 
     56 
     57 /** opaque reference to a loaded object module */
     58 typedef struct LTOModule*         lto_module_t;
     59 
     60 /** opaque reference to a code generator */
     61 typedef struct LTOCodeGenerator*  lto_code_gen_t;
     62 
     63 #ifdef __cplusplus
     64 extern "C" {
     65 #endif
     66 
     67 /**
     68  * Returns a printable string.
     69  */
     70 extern const char*
     71 lto_get_version(void);
     72 
     73 
     74 /**
     75  * Returns the last error string or NULL if last operation was successful.
     76  */
     77 extern const char*
     78 lto_get_error_message(void);
     79 
     80 /**
     81  * Checks if a file is a loadable object file.
     82  */
     83 extern bool
     84 lto_module_is_object_file(const char* path);
     85 
     86 
     87 /**
     88  * Checks if a file is a loadable object compiled for requested target.
     89  */
     90 extern bool
     91 lto_module_is_object_file_for_target(const char* path,
     92                                      const char* target_triple_prefix);
     93 
     94 
     95 /**
     96  * Checks if a buffer is a loadable object file.
     97  */
     98 extern bool
     99 lto_module_is_object_file_in_memory(const void* mem, size_t length);
    100 
    101 
    102 /**
    103  * Checks if a buffer is a loadable object compiled for requested target.
    104  */
    105 extern bool
    106 lto_module_is_object_file_in_memory_for_target(const void* mem, size_t length,
    107                                               const char* target_triple_prefix);
    108 
    109 
    110 /**
    111  * Loads an object file from disk.
    112  * Returns NULL on error (check lto_get_error_message() for details).
    113  */
    114 extern lto_module_t
    115 lto_module_create(const char* path);
    116 
    117 
    118 /**
    119  * Loads an object file from memory.
    120  * Returns NULL on error (check lto_get_error_message() for details).
    121  */
    122 extern lto_module_t
    123 lto_module_create_from_memory(const void* mem, size_t length);
    124 
    125 /**
    126  * Loads an object file from disk. The seek point of fd is not preserved.
    127  * Returns NULL on error (check lto_get_error_message() for details).
    128  */
    129 extern lto_module_t
    130 lto_module_create_from_fd(int fd, const char *path, size_t file_size);
    131 
    132 /**
    133  * Loads an object file from disk. The seek point of fd is not preserved.
    134  * Returns NULL on error (check lto_get_error_message() for details).
    135  */
    136 extern lto_module_t
    137 lto_module_create_from_fd_at_offset(int fd, const char *path, size_t file_size,
    138                                     size_t map_size, off_t offset);
    139 
    140 
    141 /**
    142  * Frees all memory internally allocated by the module.
    143  * Upon return the lto_module_t is no longer valid.
    144  */
    145 extern void
    146 lto_module_dispose(lto_module_t mod);
    147 
    148 
    149 /**
    150  * Returns triple string which the object module was compiled under.
    151  */
    152 extern const char*
    153 lto_module_get_target_triple(lto_module_t mod);
    154 
    155 /**
    156  * Sets triple string with which the object will be codegened.
    157  */
    158 extern void
    159 lto_module_set_target_triple(lto_module_t mod, const char *triple);
    160 
    161 
    162 /**
    163  * Returns the number of symbols in the object module.
    164  */
    165 extern unsigned int
    166 lto_module_get_num_symbols(lto_module_t mod);
    167 
    168 
    169 /**
    170  * Returns the name of the ith symbol in the object module.
    171  */
    172 extern const char*
    173 lto_module_get_symbol_name(lto_module_t mod, unsigned int index);
    174 
    175 
    176 /**
    177  * Returns the attributes of the ith symbol in the object module.
    178  */
    179 extern lto_symbol_attributes
    180 lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index);
    181 
    182 
    183 /**
    184  * Instantiates a code generator.
    185  * Returns NULL on error (check lto_get_error_message() for details).
    186  */
    187 extern lto_code_gen_t
    188 lto_codegen_create(void);
    189 
    190 
    191 /**
    192  * Frees all code generator and all memory it internally allocated.
    193  * Upon return the lto_code_gen_t is no longer valid.
    194  */
    195 extern void
    196 lto_codegen_dispose(lto_code_gen_t);
    197 
    198 
    199 
    200 /**
    201  * Add an object module to the set of modules for which code will be generated.
    202  * Returns true on error (check lto_get_error_message() for details).
    203  */
    204 extern bool
    205 lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod);
    206 
    207 
    208 
    209 /**
    210  * Sets if debug info should be generated.
    211  * Returns true on error (check lto_get_error_message() for details).
    212  */
    213 extern bool
    214 lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model);
    215 
    216 
    217 /**
    218  * Sets which PIC code model to generated.
    219  * Returns true on error (check lto_get_error_message() for details).
    220  */
    221 extern bool
    222 lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model);
    223 
    224 
    225 /**
    226  * Sets the cpu to generate code for.
    227  */
    228 extern void
    229 lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu);
    230 
    231 
    232 /**
    233  * Sets the location of the assembler tool to run. If not set, libLTO
    234  * will use gcc to invoke the assembler.
    235  */
    236 extern void
    237 lto_codegen_set_assembler_path(lto_code_gen_t cg, const char* path);
    238 
    239 /**
    240  * Sets extra arguments that libLTO should pass to the assembler.
    241  */
    242 extern void
    243 lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
    244                                int nargs);
    245 
    246 /**
    247  * Adds to a list of all global symbols that must exist in the final
    248  * generated code.  If a function is not listed, it might be
    249  * inlined into every usage and optimized away.
    250  */
    251 extern void
    252 lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, const char* symbol);
    253 
    254 
    255 /**
    256  * Writes a new object file at the specified path that contains the
    257  * merged contents of all modules added so far.
    258  * Returns true on error (check lto_get_error_message() for details).
    259  */
    260 extern bool
    261 lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path);
    262 
    263 
    264 /**
    265  * Generates code for all added modules into one native object file.
    266  * On success returns a pointer to a generated mach-o/ELF buffer and
    267  * length set to the buffer size.  The buffer is owned by the
    268  * lto_code_gen_t and will be freed when lto_codegen_dispose()
    269  * is called, or lto_codegen_compile() is called again.
    270  * On failure, returns NULL (check lto_get_error_message() for details).
    271  */
    272 extern const void*
    273 lto_codegen_compile(lto_code_gen_t cg, size_t* length);
    274 
    275 /**
    276  * Generates code for all added modules into one native object file.
    277  * The name of the file is written to name. Returns true on error.
    278  */
    279 extern bool
    280 lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name);
    281 
    282 
    283 /**
    284  * Sets options to help debug codegen bugs.
    285  */
    286 extern void
    287 lto_codegen_debug_options(lto_code_gen_t cg, const char *);
    288 #ifdef __cplusplus
    289 }
    290 #endif
    291 
    292 
    293 #endif
    294