/*===-- llvm-c/lto.h - LTO Public C Interface ---------------------*- C -*-===*\|* *||* The LLVM Compiler Infrastructure *||* *||* This file is distributed under the University of Illinois Open Source *||* License. See LICENSE.TXT for details. *||* *||*===----------------------------------------------------------------------===*||* *||* This header provides public interface to an abstract link time optimization*||* library. LLVM provides an implementation of this interface for use with *||* llvm bitcode files. *||* *|\*===----------------------------------------------------------------------===*/#ifndef LTO_H#define LTO_H 1#include<stdbool.h>#include<stddef.h>#include<unistd.h>#define LTO_API_VERSION 4typedefenum{LTO_SYMBOL_ALIGNMENT_MASK=0x0000001F,/* log2 of alignment */LTO_SYMBOL_PERMISSIONS_MASK=0x000000E0,LTO_SYMBOL_PERMISSIONS_CODE=0x000000A0,LTO_SYMBOL_PERMISSIONS_DATA=0x000000C0,LTO_SYMBOL_PERMISSIONS_RODATA=0x00000080,LTO_SYMBOL_DEFINITION_MASK=0x00000700,LTO_SYMBOL_DEFINITION_REGULAR=0x00000100,LTO_SYMBOL_DEFINITION_TENTATIVE=0x00000200,LTO_SYMBOL_DEFINITION_WEAK=0x00000300,LTO_SYMBOL_DEFINITION_UNDEFINED=0x00000400,LTO_SYMBOL_DEFINITION_WEAKUNDEF=0x00000500,LTO_SYMBOL_SCOPE_MASK=0x00003800,LTO_SYMBOL_SCOPE_INTERNAL=0x00000800,LTO_SYMBOL_SCOPE_HIDDEN=0x00001000,LTO_SYMBOL_SCOPE_PROTECTED=0x00002000,LTO_SYMBOL_SCOPE_DEFAULT=0x00001800,LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN=0x00002800}lto_symbol_attributes;typedefenum{LTO_DEBUG_MODEL_NONE=0,LTO_DEBUG_MODEL_DWARF=1}lto_debug_model;typedefenum{LTO_CODEGEN_PIC_MODEL_STATIC=0,LTO_CODEGEN_PIC_MODEL_DYNAMIC=1,LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC=2}lto_codegen_model;/** opaque reference to a loaded object module */typedefstructLTOModule*lto_module_t;/** opaque reference to a code generator */typedefstructLTOCodeGenerator*lto_code_gen_t;#ifdef __cplusplusextern"C"{#endif/** * Returns a printable string. */externconstchar*lto_get_version(void);/** * Returns the last error string or NULL if last operation was successful. */externconstchar*lto_get_error_message(void);/** * Checks if a file is a loadable object file. */externboollto_module_is_object_file(constchar*path);/** * Checks if a file is a loadable object compiled for requested target. */externboollto_module_is_object_file_for_target(constchar*path,constchar*target_triple_prefix);/** * Checks if a buffer is a loadable object file. */externboollto_module_is_object_file_in_memory(constvoid*mem,size_tlength);/** * Checks if a buffer is a loadable object compiled for requested target. */externboollto_module_is_object_file_in_memory_for_target(constvoid*mem,size_tlength,constchar*target_triple_prefix);/** * Loads an object file from disk. * Returns NULL on error (check lto_get_error_message() for details). */externlto_module_tlto_module_create(constchar*path);/** * Loads an object file from memory. * Returns NULL on error (check lto_get_error_message() for details). */externlto_module_tlto_module_create_from_memory(constvoid*mem,size_tlength);/** * Loads an object file from disk. The seek point of fd is not preserved. * Returns NULL on error (check lto_get_error_message() for details). */externlto_module_tlto_module_create_from_fd(intfd,constchar*path,size_tfile_size);/** * Loads an object file from disk. The seek point of fd is not preserved. * Returns NULL on error (check lto_get_error_message() for details). */externlto_module_tlto_module_create_from_fd_at_offset(intfd,constchar*path,size_tfile_size,size_tmap_size,off_toffset);/** * Frees all memory internally allocated by the module. * Upon return the lto_module_t is no longer valid. */externvoidlto_module_dispose(lto_module_tmod);/** * Returns triple string which the object module was compiled under. */externconstchar*lto_module_get_target_triple(lto_module_tmod);/** * Sets triple string with which the object will be codegened. */externvoidlto_module_set_target_triple(lto_module_tmod,constchar*triple);/** * Returns the number of symbols in the object module. */externunsignedintlto_module_get_num_symbols(lto_module_tmod);/** * Returns the name of the ith symbol in the object module. */externconstchar*lto_module_get_symbol_name(lto_module_tmod,unsignedintindex);/** * Returns the attributes of the ith symbol in the object module. */externlto_symbol_attributeslto_module_get_symbol_attribute(lto_module_tmod,unsignedintindex);/** * Instantiates a code generator. * Returns NULL on error (check lto_get_error_message() for details). */externlto_code_gen_tlto_codegen_create(void);/** * Frees all code generator and all memory it internally allocated. * Upon return the lto_code_gen_t is no longer valid. */externvoidlto_codegen_dispose(lto_code_gen_t);/** * Add an object module to the set of modules for which code will be generated. * Returns true on error (check lto_get_error_message() for details). */externboollto_codegen_add_module(lto_code_gen_tcg,lto_module_tmod);/** * Sets if debug info should be generated. * Returns true on error (check lto_get_error_message() for details). */externboollto_codegen_set_debug_model(lto_code_gen_tcg,lto_debug_model);/** * Sets which PIC code model to generated. * Returns true on error (check lto_get_error_message() for details). */externboollto_codegen_set_pic_model(lto_code_gen_tcg,lto_codegen_model);/** * Sets the cpu to generate code for. */externvoidlto_codegen_set_cpu(lto_code_gen_tcg,constchar*cpu);/** * Sets the location of the assembler tool to run. If not set, libLTO * will use gcc to invoke the assembler. */externvoidlto_codegen_set_assembler_path(lto_code_gen_tcg,constchar*path);/** * Sets extra arguments that libLTO should pass to the assembler. */externvoidlto_codegen_set_assembler_args(lto_code_gen_tcg,constchar**args,intnargs);/** * Adds to a list of all global symbols that must exist in the final * generated code. If a function is not listed, it might be * inlined into every usage and optimized away. */externvoidlto_codegen_add_must_preserve_symbol(lto_code_gen_tcg,constchar*symbol);/** * Writes a new object file at the specified path that contains the * merged contents of all modules added so far. * Returns true on error (check lto_get_error_message() for details). */externboollto_codegen_write_merged_modules(lto_code_gen_tcg,constchar*path);/** * Generates code for all added modules into one native object file. * On success returns a pointer to a generated mach-o/ELF buffer and * length set to the buffer size. The buffer is owned by the * lto_code_gen_t and will be freed when lto_codegen_dispose() * is called, or lto_codegen_compile() is called again. * On failure, returns NULL (check lto_get_error_message() for details). */externconstvoid*lto_codegen_compile(lto_code_gen_tcg,size_t*length);/** * Generates code for all added modules into one native object file. * The name of the file is written to name. Returns true on error. */externboollto_codegen_compile_to_file(lto_code_gen_tcg,constchar**name);/** * Sets options to help debug codegen bugs. */externvoidlto_codegen_debug_options(lto_code_gen_tcg,constchar*);#ifdef __cplusplus}#endif#endif