aboutsummaryrefslogtreecommitdiffhomepage
path: root/ext/llvm-sys.rs/src/lto.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ext/llvm-sys.rs/src/lto.rs')
-rw-r--r--ext/llvm-sys.rs/src/lto.rs442
1 files changed, 442 insertions, 0 deletions
diff --git a/ext/llvm-sys.rs/src/lto.rs b/ext/llvm-sys.rs/src/lto.rs
new file mode 100644
index 0000000..7efddd9
--- /dev/null
+++ b/ext/llvm-sys.rs/src/lto.rs
@@ -0,0 +1,442 @@
+//! Abstract link time optimization.
+//!
+//! ## ThinLTO
+//!
+//! ThinLTO is designed to do LTO while requiring fewer resources than regular
+//! LTO. It can run much faster and in less memory (comparable to linking
+//! without LTO) than regular LTO, with essentially no loss in optimization.
+
+#![allow(non_camel_case_types)]
+
+pub type lto_bool_t = u8;
+
+// This looks kind of like bitflags but I'm not sure.
+#[repr(C)]
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum lto_symbol_attributes {
+ LTO_SYMBOL_ALIGNMENT_MASK = 31,
+ LTO_SYMBOL_PERMISSIONS_MASK = 224,
+ LTO_SYMBOL_PERMISSIONS_CODE = 160,
+ LTO_SYMBOL_PERMISSIONS_DATA = 192,
+ LTO_SYMBOL_PERMISSIONS_RODATA = 128,
+ LTO_SYMBOL_DEFINITION_MASK = 1792,
+ LTO_SYMBOL_DEFINITION_REGULAR = 256,
+ LTO_SYMBOL_DEFINITION_TENTATIVE = 512,
+ LTO_SYMBOL_DEFINITION_WEAK = 768,
+ LTO_SYMBOL_DEFINITION_UNDEFINED = 1024,
+ LTO_SYMBOL_DEFINITION_WEAKUNDEF = 1280,
+ LTO_SYMBOL_SCOPE_MASK = 14336,
+ LTO_SYMBOL_SCOPE_INTERNAL = 2048,
+ LTO_SYMBOL_SCOPE_HIDDEN = 0x1000,
+ LTO_SYMBOL_SCOPE_PROTECTED = 0x2000,
+ LTO_SYMBOL_SCOPE_DEFAULT = 0x1800,
+ LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN = 0x2800,
+ /// Added in LLVM 3.7.
+ LTO_SYMBOL_COMDAT = 0x4000,
+ /// Added in LLVM 3.7.
+ LTO_SYMBOL_ALIAS = 0x8000,
+}
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum lto_debug_model {
+ LTO_DEBUG_MODEL_NONE = 0,
+ LTO_DEBUG_MODEL_DWARF = 1,
+}
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum lto_codegen_model {
+ LTO_CODEGEN_PIC_MODEL_STATIC = 0,
+ LTO_CODEGEN_PIC_MODEL_DYNAMIC = 1,
+ LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2,
+ LTO_CODEGEN_PIC_MODEL_DEFAULT = 3,
+}
+
+#[derive(Debug)]
+pub enum LLVMOpaqueLTOModule {}
+
+pub type lto_module_t = *mut LLVMOpaqueLTOModule;
+
+#[derive(Debug)]
+pub enum LLVMOpaqueLTOCodeGenerator {}
+
+pub type lto_code_gen_t = *mut LLVMOpaqueLTOCodeGenerator;
+
+#[derive(Debug)]
+pub enum LLVMOpaqueThinLTOCodeGenerator {}
+
+pub type thinlto_code_gen_t = *mut LLVMOpaqueThinLTOCodeGenerator;
+
+#[derive(Debug)]
+pub enum LLVMOpaqueLTOInput {}
+
+pub type lto_input_t = *mut LLVMOpaqueLTOInput;
+
+#[repr(C)]
+#[derive(Clone, Copy, Debug, PartialEq)]
+pub enum lto_codegen_diagnostic_severity_t {
+ LTO_DS_ERROR = 0,
+ LTO_DS_WARNING = 1,
+ LTO_DS_REMARK = 3,
+ LTO_DS_NOTE = 2,
+}
+
+pub type lto_diagnostic_handler_t = Option<
+ extern "C" fn(
+ severity: lto_codegen_diagnostic_severity_t,
+ diag: *const ::libc::c_char,
+ ctxt: *mut ::libc::c_void,
+ ),
+>;
+
+extern "C" {
+ pub fn lto_get_version() -> *const ::libc::c_char;
+ pub fn lto_get_error_message() -> *const ::libc::c_char;
+ pub fn lto_module_is_object_file(path: *const ::libc::c_char) -> lto_bool_t;
+ pub fn lto_module_is_object_file_for_target(
+ path: *const ::libc::c_char,
+ target_triple_prefix: *const ::libc::c_char,
+ ) -> lto_bool_t;
+ /// Return true if `Buffer` contains a bitcode file with ObjC code
+ /// (category or class) in it.
+ pub fn lto_module_has_objc_category(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ ) -> lto_bool_t;
+ /// Checks if a buffer is a loadable object file.
+ pub fn lto_module_is_object_file_in_memory(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ ) -> lto_bool_t;
+ pub fn lto_module_is_object_file_in_memory_for_target(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ target_triple_prefix: *const ::libc::c_char,
+ ) -> lto_bool_t;
+ pub fn lto_module_create(path: *const ::libc::c_char) -> lto_module_t;
+ pub fn lto_module_create_from_memory(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ ) -> lto_module_t;
+ pub fn lto_module_create_from_memory_with_path(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ path: *const ::libc::c_char,
+ ) -> lto_module_t;
+ pub fn lto_module_create_in_local_context(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ path: *const ::libc::c_char,
+ ) -> lto_module_t;
+ pub fn lto_module_create_in_codegen_context(
+ mem: *const ::libc::c_void,
+ length: ::libc::size_t,
+ path: *const ::libc::c_char,
+ cg: lto_code_gen_t,
+ ) -> lto_module_t;
+ pub fn lto_module_create_from_fd(
+ fd: ::libc::c_int,
+ path: *const ::libc::c_char,
+ file_size: ::libc::size_t,
+ ) -> lto_module_t;
+ pub fn lto_module_create_from_fd_at_offset(
+ fd: ::libc::c_int,
+ path: *const ::libc::c_char,
+ file_size: ::libc::size_t,
+ map_size: ::libc::size_t,
+ offset: ::libc::off_t,
+ ) -> lto_module_t;
+ pub fn lto_module_dispose(_mod: lto_module_t);
+ pub fn lto_module_get_target_triple(_mod: lto_module_t) -> *const ::libc::c_char;
+ pub fn lto_module_set_target_triple(_mod: lto_module_t, triple: *const ::libc::c_char);
+ pub fn lto_module_get_num_symbols(_mod: lto_module_t) -> ::libc::c_uint;
+ pub fn lto_module_get_symbol_name(
+ _mod: lto_module_t,
+ index: ::libc::c_uint,
+ ) -> *const ::libc::c_char;
+ pub fn lto_module_get_symbol_attribute(
+ _mod: lto_module_t,
+ index: ::libc::c_uint,
+ ) -> lto_symbol_attributes;
+ /// Returns the module's linker options.
+ ///
+ /// The linker options may consist of multiple flags. It is the linker's
+ /// responsibility to split the flags using a platform-specific mechanism.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_module_get_linkeropts(_mod: lto_module_t) -> *const ::libc::c_char;
+ pub fn lto_module_get_macho_cputype(
+ _mod: lto_module_t,
+ out_cputype: *mut ::libc::c_uint,
+ out_cpusubtype: *mut ::libc::c_uint,
+ ) -> lto_bool_t;
+ /// Return true if the module has either the `@llvm.global_ctors` or the `@llvm.global_dtors`
+ /// symbol.
+ ///
+ /// Added in API version 29 (LLVM 14).
+ pub fn lto_module_has_ctor_dtor(mod_: lto_module_t) -> lto_bool_t;
+ pub fn lto_codegen_set_diagnostic_handler(
+ arg1: lto_code_gen_t,
+ arg2: lto_diagnostic_handler_t,
+ arg3: *mut ::libc::c_void,
+ );
+ pub fn lto_codegen_create() -> lto_code_gen_t;
+ pub fn lto_codegen_create_in_local_context() -> lto_code_gen_t;
+ pub fn lto_codegen_dispose(arg1: lto_code_gen_t);
+ pub fn lto_codegen_add_module(cg: lto_code_gen_t, _mod: lto_module_t) -> lto_bool_t;
+ /// Sets the object module for code gneeration. This will transfer ownership
+ /// of the module to the code generator.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_codegen_set_module(cg: lto_code_gen_t, _mod: lto_module_t);
+ pub fn lto_codegen_set_debug_model(cg: lto_code_gen_t, arg1: lto_debug_model) -> lto_bool_t;
+ pub fn lto_codegen_set_pic_model(cg: lto_code_gen_t, arg1: lto_codegen_model) -> lto_bool_t;
+ pub fn lto_codegen_set_cpu(cg: lto_code_gen_t, cpu: *const ::libc::c_char);
+ pub fn lto_codegen_set_assembler_path(cg: lto_code_gen_t, path: *const ::libc::c_char);
+ pub fn lto_codegen_set_assembler_args(
+ cg: lto_code_gen_t,
+ args: *mut *const ::libc::c_char,
+ nargs: ::libc::c_int,
+ );
+ pub fn lto_codegen_add_must_preserve_symbol(cg: lto_code_gen_t, symbol: *const ::libc::c_char);
+ pub fn lto_codegen_write_merged_modules(
+ cg: lto_code_gen_t,
+ path: *const ::libc::c_char,
+ ) -> lto_bool_t;
+ pub fn lto_codegen_compile(
+ cg: lto_code_gen_t,
+ length: *mut ::libc::size_t,
+ ) -> *const ::libc::c_void;
+ pub fn lto_codegen_compile_to_file(
+ cg: lto_code_gen_t,
+ name: *mut *const ::libc::c_char,
+ ) -> lto_bool_t;
+ /// Runs optimization for the merged module.
+ ///
+ /// Returns true on error.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_codegen_optimize(cg: lto_code_gen_t) -> lto_bool_t;
+ /// Generates code for the optimized merged module into one native object file.
+ ///
+ /// Does not run IR optimizations on the merged module.
+ ///
+ /// Returns a pointer to the generated mach-o/ELF buffer with length
+ /// set to the buffer size. This buffer is owned by `cg` and will be
+ /// freed when `lto_codegen_dispose` is called or `lto_codegen_compile_optimized`
+ /// is called again. Returns null on failure.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_codegen_compile_optimized(
+ cg: lto_code_gen_t,
+ length: *mut ::libc::size_t,
+ ) -> *mut ::libc::c_void;
+ /// Returns the runtime API version.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_api_version() -> ::libc::c_uint;
+ pub fn lto_set_debug_options(options: *mut *const ::libc::c_char, number: ::libc::c_int);
+ pub fn lto_codegen_debug_options(cg: lto_code_gen_t, arg1: *const ::libc::c_char);
+ pub fn lto_codegen_debug_options_array(
+ cg: lto_code_gen_t,
+ arg2: *const *const ::libc::c_char,
+ number: ::libc::c_int,
+ );
+ pub fn lto_initialize_disassembler();
+ /// Sets if we should run the internalize pass during optimization and code generation.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_codegen_set_should_internalize(cg: lto_code_gen_t, ShouldInternalize: lto_bool_t);
+ /// Set whether to embed uselists in bitcode.
+ ///
+ /// Sets whether `lto_codegen_write_merged_modules` should embed uselists in
+ /// output bitcode. This should be turned on for all -save-temps output.
+ ///
+ /// Added in LLVM 3.7.
+ pub fn lto_codegen_set_should_embed_uselists(
+ cg: lto_code_gen_t,
+ ShouldEmbedUselists: lto_bool_t,
+ );
+}
+
+/// Type to wrap a single object returned by ThinLTO.
+#[repr(C)]
+#[derive(Debug)]
+#[allow(non_snake_case)]
+pub struct LTOObjectBuffer {
+ Buffer: *const ::libc::c_char,
+ Size: ::libc::size_t,
+}
+
+extern "C" {
+ /// Instantiates a ThinLTO code generator.
+ ///
+ /// Returns null on error (check `lto_get_error_message` for details).
+ ///
+ /// The code generator should not be reused.
+ pub fn thinlto_create_codegen() -> thinlto_code_gen_t;
+ /// Frees a code generator.
+ pub fn thinlto_codegen_dispose(cg: thinlto_code_gen_t);
+ /// Add a module to a code generator.
+ ///
+ /// Identifier must be unique among all the modules in the code generator.
+ /// The data buffer remains owned by the client, and must live at least
+ /// as long as the code generator.
+ ///
+ /// Returns null on failure.
+ pub fn thinlto_codegen_add_module(
+ cg: thinlto_code_gen_t,
+ identifier: *const ::libc::c_char,
+ data: *const ::libc::c_char,
+ length: ::libc::c_int,
+ );
+ /// Optimize and codegen all modules attached to the code generator.
+ ///
+ /// Resulting objects are accessible with `thinlto_module_get_object`.
+ pub fn thinlto_codegen_process(cg: thinlto_code_gen_t);
+ /// Return the number of object files produced by the code generator.
+ ///
+ /// This usually matches the number of input files, but is not guaranteed
+ /// to.
+ pub fn thinlto_module_get_num_objects(cg: thinlto_code_gen_t) -> ::libc::c_int;
+ /// Return a reference to the `index`th object file produced by the
+ /// code generator.
+ pub fn thinlto_module_get_object(
+ cg: thinlto_code_gen_t,
+ index: ::libc::c_uint,
+ ) -> LTOObjectBuffer;
+ /// Return the number of object files produced by the code generator.
+ ///
+ /// Usually the same as the number of input files, but not guaranteed.
+ pub fn thinlto_module_get_num_object_files(cg: thinlto_code_gen_t) -> ::libc::c_uint;
+ /// Return the path to the ith output object file.
+ ///
+ /// Use `thinlto_module_get_num_object_files` to get the number of available objects.
+ pub fn thinlto_module_get_object_file(
+ cg: thinlto_code_gen_t,
+ index: ::libc::c_uint,
+ ) -> *const ::libc::c_char;
+ /// Set which PIC code model to generate.
+ ///
+ /// Returns true on error.
+ pub fn thinlto_codegen_set_pic_model(
+ cg: thinlto_code_gen_t,
+ model: lto_codegen_model,
+ ) -> lto_bool_t;
+
+ // ThinLTO cache control.
+ // Set the path to a directory to use as cache for increment build.
+ //
+ // Setting this activates caching.
+ pub fn thinlto_codegen_set_cache_dir(cg: thinlto_code_gen_t, cache_dir: *const ::libc::c_char);
+ /// Set the cache pruning interval, in seconds.
+ ///
+ /// A negative value disables pruning, and 0 will force pruning to occur.
+ pub fn thinlto_codegen_set_cache_pruning_interval(
+ cg: thinlto_code_gen_t,
+ interval: ::libc::c_int,
+ );
+ /// Set the maximum cache size to persist across builds.
+ ///
+ /// This is expressed as a percentage of available disk space. 100 means no limit,
+ /// and 50 means no more than half of the available disk space. 0 is ignored, and
+ /// values over 100 will be reduced to 100.
+ pub fn thinlto_codegen_set_final_cache_size_relative_to_available_space(
+ cg: thinlto_code_gen_t,
+ percentage: ::libc::c_uint,
+ );
+ /// Set the expiration (in seconds) for cache entries.
+ pub fn thinlto_codegen_set_cache_entry_expiration(
+ cg: thinlto_code_gen_t,
+ expiration: ::libc::c_uint,
+ );
+ /// Set the maximum size of the cache directory (in bytes). A value over the
+ /// amount of available space on the disk will be reduced to the amount of
+ /// available space. An unspecified default value will be applied. A value of 0
+ /// will be ignored.
+ pub fn thinlto_codegen_set_cache_size_bytes(
+ cg: thinlto_code_gen_t,
+ max_size_bytes: ::libc::c_uint,
+ );
+ /// Same as thinlto_codegen_set_cache_size_bytes, except the maximum size is in
+ /// megabytes (2^20 bytes).
+ pub fn thinlto_codegen_set_cache_size_megabytes(
+ cg: thinlto_code_gen_t,
+ max_size_megabytes: ::libc::c_uint,
+ );
+ /// Sets the maximum number of files in the cache directory. An unspecified default value will be applied. A value of 0 will be ignored.
+ pub fn thinlto_codegen_set_cache_size_files(
+ cg: thinlto_code_gen_t,
+ max_size_files: ::libc::c_uint,
+ );
+
+ /// Create an LTO input file from a buffer.
+ pub fn lto_input_create(
+ buffer: *const ::libc::c_void,
+ buffer_size: ::libc::size_t,
+ path: *const ::libc::c_char,
+ ) -> lto_input_t;
+ /// Free all memory allocated by the input file.
+ pub fn lto_input_dispose(input: lto_input_t);
+ /// Get the number of dependent library specifiers for the given input.
+ pub fn lto_input_get_num_dependent_libraries(input: lto_input_t) -> ::libc::c_uint;
+ /// Get the `i`th dependent library specifier for the given input file.
+ ///
+ /// The returned string is not null-terminated.
+ pub fn lto_input_get_dependent_library(
+ input: lto_input_t,
+ index: ::libc::size_t,
+ size: *mut ::libc::size_t,
+ ) -> *const ::libc::c_char;
+ /// Return the list of libcall symbols that can be generated by LTO
+ /// that might not be visible from the symbol table of bitcode files.
+ pub fn lto_runtime_lib_symbols_list(size: *mut usize) -> *const *const ::libc::c_char;
+
+ /// Set the path to a directory to use as temporary bitcode storage.
+ ///
+ /// This is meant to make the bitcode files available for debugging.
+ pub fn thinlto_codegen_set_savetemps_dir(
+ cg: thinlto_code_gen_t,
+ save_temps_dir: *const ::libc::c_char,
+ );
+ /// Set the path to a directory to save generated object files.
+ ///
+ /// Set this to request on-disk rather than in-memory buffers. When set, use
+ /// `thinlto_module_get_object_file` instead of `thinlto_module_get_object`.
+ pub fn thinlto_set_generated_objects_dir(
+ cg: thinlto_code_gen_t,
+ save_temps_dir: *const ::libc::c_char,
+ );
+ /// Set the CPU to generate code for.
+ pub fn thinlto_codegen_set_cpu(cg: thinlto_code_gen_t, cpu: *const ::libc::c_char);
+ /// Disable code generation (running all stages until codegen).
+ ///
+ /// The output with codegen disabled is bitcode.
+ pub fn thinlto_codegen_disable_codegen(cg: thinlto_code_gen_t, disable: lto_bool_t);
+ /// Perform codegen only; disable all other stages.
+ pub fn thinlto_codegen_set_codegen_only(cg: thinlto_code_gen_t, codegen_only: lto_bool_t);
+ /// Parse -mllvm style debug options.
+ pub fn thinlto_debug_options(options: *const *const ::libc::c_char, number: ::libc::c_int);
+ /// Test if a module has ThinLTO linking support.
+ pub fn lto_module_is_thinlto(module: lto_module_t) -> lto_bool_t;
+ /// Add a symbol to the list of global symbols that must exist in the
+ /// final generated code.
+ ///
+ /// Functions not listed may be inlined in every usage and optimized away.
+ pub fn thinlto_codegen_add_must_preserve_symbol(
+ cg: thinlto_code_gen_t,
+ name: *const ::libc::c_char,
+ length: ::libc::c_int,
+ );
+ /// Add a symbol to the list of global symbols that are cross-referenced
+ /// between ThinLTO files.
+ ///
+ /// Symbols listed can be discarded if every reference from a ThinLTO module
+ /// to a symbol is optimized away, then the symbol can be discarded.
+ pub fn thinlto_codegen_add_cross_referenced_symbol(
+ cg: thinlto_code_gen_t,
+ name: *const ::libc::c_char,
+ length: ::libc::c_int,
+ );
+}