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