diff options
| author | bors <bors@rust-lang.org> | 2022-01-25 05:15:21 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-01-25 05:15:21 +0000 |
| commit | df368ae457c54fb95d3e64f9986a5f171a6370f0 (patch) | |
| tree | 937d7106779ef49d1997a2178f187af99809a09a /compiler/rustc_codegen_llvm/src/llvm | |
| parent | e7825f2b690c9a0d21b6f6d84c404bb53b151b38 (diff) | |
| parent | 13b87d8cc73b8ac9cab1fa99b2b61820d4d483a6 (diff) | |
| download | rust-df368ae457c54fb95d3e64f9986a5f171a6370f0.tar.gz rust-df368ae457c54fb95d3e64f9986a5f171a6370f0.zip | |
Auto merge of #93288 - matthiaskrgr:rollup-uu4uwd1, r=matthiaskrgr
Rollup of 8 pull requests Successful merges: - #88794 (Add a `try_clone()` function to `OwnedFd`.) - #93064 (Properly track `DepNode`s in trait evaluation provisional cache) - #93118 (Move param count error emission to end of `check_argument_types`) - #93144 (Work around missing code coverage data causing llvm-cov failures) - #93169 (Fix inconsistency of local blanket impls) - #93175 (Implement stable overlap check considering negative traits) - #93251 (rustdoc settings: use radio buttons for theme) - #93269 (Use error-on-mismatch policy for PAuth module flags.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/llvm')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs index a1c7d2b4f61..2b102188790 100644 --- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs +++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs @@ -61,6 +61,26 @@ pub enum LLVMMachineType { ARM = 0x01c0, } +/// LLVM's Module::ModFlagBehavior, defined in llvm/include/llvm/IR/Module.h. +/// +/// When merging modules (e.g. during LTO), their metadata flags are combined. Conflicts are +/// resolved according to the merge behaviors specified here. Flags differing only in merge +/// behavior are still considered to be in conflict. +/// +/// In order for Rust-C LTO to work, we must specify behaviors compatible with Clang. Notably, +/// 'Error' and 'Warning' cannot be mixed for a given flag. +#[derive(Copy, Clone, PartialEq)] +#[repr(C)] +pub enum LLVMModFlagBehavior { + Error = 1, + Warning = 2, + Require = 3, + Override = 4, + Append = 5, + AppendUnique = 6, + Max = 7, +} + // Consts for the LLVM CallConv type, pre-cast to usize. /// LLVM CallingConv::ID. Should we wrap this? @@ -1895,7 +1915,16 @@ extern "C" { pub fn LLVMRustIsRustLLVM() -> bool; - pub fn LLVMRustAddModuleFlag(M: &Module, name: *const c_char, value: u32); + /// Add LLVM module flags. + /// + /// In order for Rust-C LTO to work, module flags must be compatible with Clang. What + /// "compatible" means depends on the merge behaviors involved. + pub fn LLVMRustAddModuleFlag( + M: &Module, + merge_behavior: LLVMModFlagBehavior, + name: *const c_char, + value: u32, + ); pub fn LLVMRustMetadataAsValue<'a>(C: &'a Context, MD: &'a Metadata) -> &'a Value; |
