Rollup merge of #132319 - Zalathar:add-module-flag, r=jieyouxu
cg_llvm: Clean up FFI calls for setting module flags This is a combination of several inter-related changes to how module flags are set: - Remove some unnecessary code for setting an `"LTOPostLink"` flag, which has been obsolete since LLVM 17. - Define our own enum instead of relying on enum values defined by LLVM's unstable C++ API. - Use safe wrapper functions to set module flags, instead of direct `unsafe` calls. - Consistently pass pointer/length strings instead of C strings. - Remove or shrink some `unsafe` blocks.
This commit is contained in:
commit
2707cd670c
6 changed files with 245 additions and 237 deletions
|
@ -853,25 +853,63 @@ extern "C" uint32_t LLVMRustVersionMinor() { return LLVM_VERSION_MINOR; }
|
|||
|
||||
extern "C" uint32_t LLVMRustVersionMajor() { return LLVM_VERSION_MAJOR; }
|
||||
|
||||
extern "C" void LLVMRustAddModuleFlagU32(LLVMModuleRef M,
|
||||
Module::ModFlagBehavior MergeBehavior,
|
||||
const char *Name, uint32_t Value) {
|
||||
unwrap(M)->addModuleFlag(MergeBehavior, Name, Value);
|
||||
// FFI equivalent of LLVM's `llvm::Module::ModFlagBehavior`.
|
||||
// Must match the layout of
|
||||
// `rustc_codegen_llvm::llvm::ffi::ModuleFlagMergeBehavior`.
|
||||
//
|
||||
// There is a stable LLVM-C version of this enum (`LLVMModuleFlagBehavior`),
|
||||
// but as of LLVM 19 it does not support all of the enum values in the unstable
|
||||
// C++ API.
|
||||
enum class LLVMRustModuleFlagMergeBehavior {
|
||||
Error = 1,
|
||||
Warning = 2,
|
||||
Require = 3,
|
||||
Override = 4,
|
||||
Append = 5,
|
||||
AppendUnique = 6,
|
||||
Max = 7,
|
||||
Min = 8,
|
||||
};
|
||||
|
||||
static Module::ModFlagBehavior
|
||||
fromRust(LLVMRustModuleFlagMergeBehavior Behavior) {
|
||||
switch (Behavior) {
|
||||
case LLVMRustModuleFlagMergeBehavior::Error:
|
||||
return Module::ModFlagBehavior::Error;
|
||||
case LLVMRustModuleFlagMergeBehavior::Warning:
|
||||
return Module::ModFlagBehavior::Warning;
|
||||
case LLVMRustModuleFlagMergeBehavior::Require:
|
||||
return Module::ModFlagBehavior::Require;
|
||||
case LLVMRustModuleFlagMergeBehavior::Override:
|
||||
return Module::ModFlagBehavior::Override;
|
||||
case LLVMRustModuleFlagMergeBehavior::Append:
|
||||
return Module::ModFlagBehavior::Append;
|
||||
case LLVMRustModuleFlagMergeBehavior::AppendUnique:
|
||||
return Module::ModFlagBehavior::AppendUnique;
|
||||
case LLVMRustModuleFlagMergeBehavior::Max:
|
||||
return Module::ModFlagBehavior::Max;
|
||||
case LLVMRustModuleFlagMergeBehavior::Min:
|
||||
return Module::ModFlagBehavior::Min;
|
||||
}
|
||||
report_fatal_error("bad LLVMRustModuleFlagMergeBehavior");
|
||||
}
|
||||
|
||||
extern "C" void
|
||||
LLVMRustAddModuleFlagU32(LLVMModuleRef M,
|
||||
LLVMRustModuleFlagMergeBehavior MergeBehavior,
|
||||
const char *Name, size_t NameLen, uint32_t Value) {
|
||||
unwrap(M)->addModuleFlag(fromRust(MergeBehavior), StringRef(Name, NameLen),
|
||||
Value);
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustAddModuleFlagString(
|
||||
LLVMModuleRef M, Module::ModFlagBehavior MergeBehavior, const char *Name,
|
||||
const char *Value, size_t ValueLen) {
|
||||
LLVMModuleRef M, LLVMRustModuleFlagMergeBehavior MergeBehavior,
|
||||
const char *Name, size_t NameLen, const char *Value, size_t ValueLen) {
|
||||
unwrap(M)->addModuleFlag(
|
||||
MergeBehavior, Name,
|
||||
fromRust(MergeBehavior), StringRef(Name, NameLen),
|
||||
MDString::get(unwrap(M)->getContext(), StringRef(Value, ValueLen)));
|
||||
}
|
||||
|
||||
extern "C" bool LLVMRustHasModuleFlag(LLVMModuleRef M, const char *Name,
|
||||
size_t Len) {
|
||||
return unwrap(M)->getModuleFlag(StringRef(Name, Len)) != nullptr;
|
||||
}
|
||||
|
||||
extern "C" void LLVMRustGlobalAddMetadata(LLVMValueRef Global, unsigned Kind,
|
||||
LLVMMetadataRef MD) {
|
||||
unwrap<GlobalObject>(Global)->addMetadata(Kind, *unwrap<MDNode>(MD));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue