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 LLVM_C_LTO_H
     17 #define LLVM_C_LTO_H
     18 
     19 #include <stddef.h>
     20 #include <sys/types.h>
     21 
     22 #ifndef __cplusplus
     23 #if !defined(_MSC_VER)
     24 #include <stdbool.h>
     25 typedef bool lto_bool_t;
     26 #else
     27 /* MSVC in particular does not have anything like _Bool or bool in C, but we can
     28    at least make sure the type is the same size.  The implementation side will
     29    use C++ bool. */
     30 typedef unsigned char lto_bool_t;
     31 #endif
     32 #else
     33 typedef bool lto_bool_t;
     34 #endif
     35 
     36 /**
     37  * @defgroup LLVMCLTO LTO
     38  * @ingroup LLVMC
     39  *
     40  * @{
     41  */
     42 
     43 #define LTO_API_VERSION 17
     44 
     45 /**
     46  * \since prior to LTO_API_VERSION=3
     47  */
     48 typedef enum {
     49     LTO_SYMBOL_ALIGNMENT_MASK              = 0x0000001F, /* log2 of alignment */
     50     LTO_SYMBOL_PERMISSIONS_MASK            = 0x000000E0,
     51     LTO_SYMBOL_PERMISSIONS_CODE            = 0x000000A0,
     52     LTO_SYMBOL_PERMISSIONS_DATA            = 0x000000C0,
     53     LTO_SYMBOL_PERMISSIONS_RODATA          = 0x00000080,
     54     LTO_SYMBOL_DEFINITION_MASK             = 0x00000700,
     55     LTO_SYMBOL_DEFINITION_REGULAR          = 0x00000100,
     56     LTO_SYMBOL_DEFINITION_TENTATIVE        = 0x00000200,
     57     LTO_SYMBOL_DEFINITION_WEAK             = 0x00000300,
     58     LTO_SYMBOL_DEFINITION_UNDEFINED        = 0x00000400,
     59     LTO_SYMBOL_DEFINITION_WEAKUNDEF        = 0x00000500,
     60     LTO_SYMBOL_SCOPE_MASK                  = 0x00003800,
     61     LTO_SYMBOL_SCOPE_INTERNAL              = 0x00000800,
     62     LTO_SYMBOL_SCOPE_HIDDEN                = 0x00001000,
     63     LTO_SYMBOL_SCOPE_PROTECTED             = 0x00002000,
     64     LTO_SYMBOL_SCOPE_DEFAULT               = 0x00001800,
     65     LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x00002800,
     66     LTO_SYMBOL_COMDAT                      = 0x00004000,
     67     LTO_SYMBOL_ALIAS                       = 0x00008000
     68 } lto_symbol_attributes;
     69 
     70 /**
     71  * \since prior to LTO_API_VERSION=3
     72  */
     73 typedef enum {
     74     LTO_DEBUG_MODEL_NONE         = 0,
     75     LTO_DEBUG_MODEL_DWARF        = 1
     76 } lto_debug_model;
     77 
     78 /**
     79  * \since prior to LTO_API_VERSION=3
     80  */
     81 typedef enum {
     82     LTO_CODEGEN_PIC_MODEL_STATIC         = 0,
     83     LTO_CODEGEN_PIC_MODEL_DYNAMIC        = 1,
     84     LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2,
     85     LTO_CODEGEN_PIC_MODEL_DEFAULT        = 3
     86 } lto_codegen_model;
     87 
     88 /** opaque reference to a loaded object module */
     89 typedef struct LLVMOpaqueLTOModule *lto_module_t;
     90 
     91 /** opaque reference to a code generator */
     92 typedef struct LLVMOpaqueLTOCodeGenerator *lto_code_gen_t;
     93 
     94 #ifdef __cplusplus
     95 extern "C" {
     96 #endif
     97 
     98 /**
     99  * Returns a printable string.
    100  *
    101  * \since prior to LTO_API_VERSION=3
    102  */
    103 extern const char*
    104 lto_get_version(void);
    105 
    106 
    107 /**
    108  * Returns the last error string or NULL if last operation was successful.
    109  *
    110  * \since prior to LTO_API_VERSION=3
    111  */
    112 extern const char*
    113 lto_get_error_message(void);
    114 
    115 /**
    116  * Checks if a file is a loadable object file.
    117  *
    118  * \since prior to LTO_API_VERSION=3
    119  */
    120 extern lto_bool_t
    121 lto_module_is_object_file(const char* path);
    122 
    123 
    124 /**
    125  * Checks if a file is a loadable object compiled for requested target.
    126  *
    127  * \since prior to LTO_API_VERSION=3
    128  */
    129 extern lto_bool_t
    130 lto_module_is_object_file_for_target(const char* path,
    131                                      const char* target_triple_prefix);
    132 
    133 
    134 /**
    135  * Checks if a buffer is a loadable object file.
    136  *
    137  * \since prior to LTO_API_VERSION=3
    138  */
    139 extern lto_bool_t
    140 lto_module_is_object_file_in_memory(const void* mem, size_t length);
    141 
    142 
    143 /**
    144  * Checks if a buffer is a loadable object compiled for requested target.
    145  *
    146  * \since prior to LTO_API_VERSION=3
    147  */
    148 extern lto_bool_t
    149 lto_module_is_object_file_in_memory_for_target(const void* mem, size_t length,
    150                                               const char* target_triple_prefix);
    151 
    152 
    153 /**
    154  * Loads an object file from disk.
    155  * Returns NULL on error (check lto_get_error_message() for details).
    156  *
    157  * \since prior to LTO_API_VERSION=3
    158  */
    159 extern lto_module_t
    160 lto_module_create(const char* path);
    161 
    162 
    163 /**
    164  * Loads an object file from memory.
    165  * Returns NULL on error (check lto_get_error_message() for details).
    166  *
    167  * \since prior to LTO_API_VERSION=3
    168  */
    169 extern lto_module_t
    170 lto_module_create_from_memory(const void* mem, size_t length);
    171 
    172 /**
    173  * Loads an object file from memory with an extra path argument.
    174  * Returns NULL on error (check lto_get_error_message() for details).
    175  *
    176  * \since LTO_API_VERSION=9
    177  */
    178 extern lto_module_t
    179 lto_module_create_from_memory_with_path(const void* mem, size_t length,
    180                                         const char *path);
    181 
    182 /**
    183  * \brief Loads an object file in its own context.
    184  *
    185  * Loads an object file in its own LLVMContext.  This function call is
    186  * thread-safe.  However, modules created this way should not be merged into an
    187  * lto_code_gen_t using \a lto_codegen_add_module().
    188  *
    189  * Returns NULL on error (check lto_get_error_message() for details).
    190  *
    191  * \since LTO_API_VERSION=11
    192  */
    193 extern lto_module_t
    194 lto_module_create_in_local_context(const void *mem, size_t length,
    195                                    const char *path);
    196 
    197 /**
    198  * \brief Loads an object file in the codegen context.
    199  *
    200  * Loads an object file into the same context as \c cg.  The module is safe to
    201  * add using \a lto_codegen_add_module().
    202  *
    203  * Returns NULL on error (check lto_get_error_message() for details).
    204  *
    205  * \since LTO_API_VERSION=11
    206  */
    207 extern lto_module_t
    208 lto_module_create_in_codegen_context(const void *mem, size_t length,
    209                                      const char *path, lto_code_gen_t cg);
    210 
    211 /**
    212  * Loads an object file from disk. The seek point of fd is not preserved.
    213  * Returns NULL on error (check lto_get_error_message() for details).
    214  *
    215  * \since LTO_API_VERSION=5
    216  */
    217 extern lto_module_t
    218 lto_module_create_from_fd(int fd, const char *path, size_t file_size);
    219 
    220 /**
    221  * Loads an object file from disk. The seek point of fd is not preserved.
    222  * Returns NULL on error (check lto_get_error_message() for details).
    223  *
    224  * \since LTO_API_VERSION=5
    225  */
    226 extern lto_module_t
    227 lto_module_create_from_fd_at_offset(int fd, const char *path, size_t file_size,
    228                                     size_t map_size, off_t offset);
    229 
    230 /**
    231  * Frees all memory internally allocated by the module.
    232  * Upon return the lto_module_t is no longer valid.
    233  *
    234  * \since prior to LTO_API_VERSION=3
    235  */
    236 extern void
    237 lto_module_dispose(lto_module_t mod);
    238 
    239 /**
    240  * Returns triple string which the object module was compiled under.
    241  *
    242  * \since prior to LTO_API_VERSION=3
    243  */
    244 extern const char*
    245 lto_module_get_target_triple(lto_module_t mod);
    246 
    247 /**
    248  * Sets triple string with which the object will be codegened.
    249  *
    250  * \since LTO_API_VERSION=4
    251  */
    252 extern void
    253 lto_module_set_target_triple(lto_module_t mod, const char *triple);
    254 
    255 
    256 /**
    257  * Returns the number of symbols in the object module.
    258  *
    259  * \since prior to LTO_API_VERSION=3
    260  */
    261 extern unsigned int
    262 lto_module_get_num_symbols(lto_module_t mod);
    263 
    264 
    265 /**
    266  * Returns the name of the ith symbol in the object module.
    267  *
    268  * \since prior to LTO_API_VERSION=3
    269  */
    270 extern const char*
    271 lto_module_get_symbol_name(lto_module_t mod, unsigned int index);
    272 
    273 
    274 /**
    275  * Returns the attributes of the ith symbol in the object module.
    276  *
    277  * \since prior to LTO_API_VERSION=3
    278  */
    279 extern lto_symbol_attributes
    280 lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index);
    281 
    282 
    283 /**
    284  * Returns the module's linker options.
    285  *
    286  * The linker options may consist of multiple flags. It is the linker's
    287  * responsibility to split the flags using a platform-specific mechanism.
    288  *
    289  * \since LTO_API_VERSION=16
    290  */
    291 extern const char*
    292 lto_module_get_linkeropts(lto_module_t mod);
    293 
    294 
    295 /**
    296  * Diagnostic severity.
    297  *
    298  * \since LTO_API_VERSION=7
    299  */
    300 typedef enum {
    301   LTO_DS_ERROR = 0,
    302   LTO_DS_WARNING = 1,
    303   LTO_DS_REMARK = 3, // Added in LTO_API_VERSION=10.
    304   LTO_DS_NOTE = 2
    305 } lto_codegen_diagnostic_severity_t;
    306 
    307 /**
    308  * Diagnostic handler type.
    309  * \p severity defines the severity.
    310  * \p diag is the actual diagnostic.
    311  * The diagnostic is not prefixed by any of severity keyword, e.g., 'error: '.
    312  * \p ctxt is used to pass the context set with the diagnostic handler.
    313  *
    314  * \since LTO_API_VERSION=7
    315  */
    316 typedef void (*lto_diagnostic_handler_t)(
    317     lto_codegen_diagnostic_severity_t severity, const char *diag, void *ctxt);
    318 
    319 /**
    320  * Set a diagnostic handler and the related context (void *).
    321  * This is more general than lto_get_error_message, as the diagnostic handler
    322  * can be called at anytime within lto.
    323  *
    324  * \since LTO_API_VERSION=7
    325  */
    326 extern void lto_codegen_set_diagnostic_handler(lto_code_gen_t,
    327                                                lto_diagnostic_handler_t,
    328                                                void *);
    329 
    330 /**
    331  * Instantiates a code generator.
    332  * Returns NULL on error (check lto_get_error_message() for details).
    333  *
    334  * All modules added using \a lto_codegen_add_module() must have been created
    335  * in the same context as the codegen.
    336  *
    337  * \since prior to LTO_API_VERSION=3
    338  */
    339 extern lto_code_gen_t
    340 lto_codegen_create(void);
    341 
    342 /**
    343  * \brief Instantiate a code generator in its own context.
    344  *
    345  * Instantiates a code generator in its own context.  Modules added via \a
    346  * lto_codegen_add_module() must have all been created in the same context,
    347  * using \a lto_module_create_in_codegen_context().
    348  *
    349  * \since LTO_API_VERSION=11
    350  */
    351 extern lto_code_gen_t
    352 lto_codegen_create_in_local_context(void);
    353 
    354 /**
    355  * Frees all code generator and all memory it internally allocated.
    356  * Upon return the lto_code_gen_t is no longer valid.
    357  *
    358  * \since prior to LTO_API_VERSION=3
    359  */
    360 extern void
    361 lto_codegen_dispose(lto_code_gen_t);
    362 
    363 /**
    364  * Add an object module to the set of modules for which code will be generated.
    365  * Returns true on error (check lto_get_error_message() for details).
    366  *
    367  * \c cg and \c mod must both be in the same context.  See \a
    368  * lto_codegen_create_in_local_context() and \a
    369  * lto_module_create_in_codegen_context().
    370  *
    371  * \since prior to LTO_API_VERSION=3
    372  */
    373 extern lto_bool_t
    374 lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod);
    375 
    376 /**
    377  * Sets the object module for code generation. This will transfer the ownership
    378  * of the module to the code generator.
    379  *
    380  * \c cg and \c mod must both be in the same context.
    381  *
    382  * \since LTO_API_VERSION=13
    383  */
    384 extern void
    385 lto_codegen_set_module(lto_code_gen_t cg, lto_module_t mod);
    386 
    387 /**
    388  * Sets if debug info should be generated.
    389  * Returns true on error (check lto_get_error_message() for details).
    390  *
    391  * \since prior to LTO_API_VERSION=3
    392  */
    393 extern lto_bool_t
    394 lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model);
    395 
    396 
    397 /**
    398  * Sets which PIC code model to generated.
    399  * Returns true on error (check lto_get_error_message() for details).
    400  *
    401  * \since prior to LTO_API_VERSION=3
    402  */
    403 extern lto_bool_t
    404 lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model);
    405 
    406 
    407 /**
    408  * Sets the cpu to generate code for.
    409  *
    410  * \since LTO_API_VERSION=4
    411  */
    412 extern void
    413 lto_codegen_set_cpu(lto_code_gen_t cg, const char *cpu);
    414 
    415 
    416 /**
    417  * Sets the location of the assembler tool to run. If not set, libLTO
    418  * will use gcc to invoke the assembler.
    419  *
    420  * \since LTO_API_VERSION=3
    421  */
    422 extern void
    423 lto_codegen_set_assembler_path(lto_code_gen_t cg, const char* path);
    424 
    425 /**
    426  * Sets extra arguments that libLTO should pass to the assembler.
    427  *
    428  * \since LTO_API_VERSION=4
    429  */
    430 extern void
    431 lto_codegen_set_assembler_args(lto_code_gen_t cg, const char **args,
    432                                int nargs);
    433 
    434 /**
    435  * Adds to a list of all global symbols that must exist in the final generated
    436  * code. If a function is not listed there, it might be inlined into every usage
    437  * and optimized away.
    438  *
    439  * \since prior to LTO_API_VERSION=3
    440  */
    441 extern void
    442 lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, const char* symbol);
    443 
    444 /**
    445  * Writes a new object file at the specified path that contains the
    446  * merged contents of all modules added so far.
    447  * Returns true on error (check lto_get_error_message() for details).
    448  *
    449  * \since LTO_API_VERSION=5
    450  */
    451 extern lto_bool_t
    452 lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path);
    453 
    454 /**
    455  * Generates code for all added modules into one native object file.
    456  * This calls lto_codegen_optimize then lto_codegen_compile_optimized.
    457  *
    458  * On success returns a pointer to a generated mach-o/ELF buffer and
    459  * length set to the buffer size.  The buffer is owned by the
    460  * lto_code_gen_t and will be freed when lto_codegen_dispose()
    461  * is called, or lto_codegen_compile() is called again.
    462  * On failure, returns NULL (check lto_get_error_message() for details).
    463  *
    464  * \since prior to LTO_API_VERSION=3
    465  */
    466 extern const void*
    467 lto_codegen_compile(lto_code_gen_t cg, size_t* length);
    468 
    469 /**
    470  * Generates code for all added modules into one native object file.
    471  * This calls lto_codegen_optimize then lto_codegen_compile_optimized (instead
    472  * of returning a generated mach-o/ELF buffer, it writes to a file).
    473  *
    474  * The name of the file is written to name. Returns true on error.
    475  *
    476  * \since LTO_API_VERSION=5
    477  */
    478 extern lto_bool_t
    479 lto_codegen_compile_to_file(lto_code_gen_t cg, const char** name);
    480 
    481 /**
    482  * Runs optimization for the merged module. Returns true on error.
    483  *
    484  * \since LTO_API_VERSION=12
    485  */
    486 extern lto_bool_t
    487 lto_codegen_optimize(lto_code_gen_t cg);
    488 
    489 /**
    490  * Generates code for the optimized merged module into one native object file.
    491  * It will not run any IR optimizations on the merged module.
    492  *
    493  * On success returns a pointer to a generated mach-o/ELF buffer and length set
    494  * to the buffer size.  The buffer is owned by the lto_code_gen_t and will be
    495  * freed when lto_codegen_dispose() is called, or
    496  * lto_codegen_compile_optimized() is called again. On failure, returns NULL
    497  * (check lto_get_error_message() for details).
    498  *
    499  * \since LTO_API_VERSION=12
    500  */
    501 extern const void*
    502 lto_codegen_compile_optimized(lto_code_gen_t cg, size_t* length);
    503 
    504 /**
    505  * Returns the runtime API version.
    506  *
    507  * \since LTO_API_VERSION=12
    508  */
    509 extern unsigned int
    510 lto_api_version(void);
    511 
    512 /**
    513  * Sets options to help debug codegen bugs.
    514  *
    515  * \since prior to LTO_API_VERSION=3
    516  */
    517 extern void
    518 lto_codegen_debug_options(lto_code_gen_t cg, const char *);
    519 
    520 /**
    521  * Initializes LLVM disassemblers.
    522  * FIXME: This doesn't really belong here.
    523  *
    524  * \since LTO_API_VERSION=5
    525  */
    526 extern void
    527 lto_initialize_disassembler(void);
    528 
    529 /**
    530  * Sets if we should run internalize pass during optimization and code
    531  * generation.
    532  *
    533  * \since LTO_API_VERSION=14
    534  */
    535 extern void
    536 lto_codegen_set_should_internalize(lto_code_gen_t cg,
    537                                    lto_bool_t ShouldInternalize);
    538 
    539 /**
    540  * \brief Set whether to embed uselists in bitcode.
    541  *
    542  * Sets whether \a lto_codegen_write_merged_modules() should embed uselists in
    543  * output bitcode.  This should be turned on for all -save-temps output.
    544  *
    545  * \since LTO_API_VERSION=15
    546  */
    547 extern void
    548 lto_codegen_set_should_embed_uselists(lto_code_gen_t cg,
    549                                       lto_bool_t ShouldEmbedUselists);
    550 
    551 #ifdef __cplusplus
    552 }
    553 #endif
    554 
    555 /**
    556  * @}
    557  */
    558 
    559 #endif
    560