Skip to content

Commit 570b0f8

Browse files
committed
[WIP] Maybe this works on Windows?
1 parent f06387a commit 570b0f8

File tree

5 files changed

+57
-17
lines changed

5 files changed

+57
-17
lines changed

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2083,6 +2083,8 @@ unsafe extern "C" {
20832083
ValueLen: size_t,
20842084
);
20852085

2086+
pub(crate) fn LLVMRustAddLinkerOptions(M: &Module, Value: *const c_char, ValueLen: size_t);
2087+
20862088
pub(crate) fn LLVMRustDIBuilderCreateCompileUnit<'a>(
20872089
Builder: &DIBuilder<'a>,
20882090
Lang: c_uint,

compiler/rustc_codegen_llvm/src/llvm/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,12 @@ pub(crate) fn add_module_flag_str(
441441
}
442442
}
443443

444+
pub(crate) fn add_module_linker_option(module: &Module, value: &str) {
445+
unsafe {
446+
LLVMRustAddLinkerOptions(module, value.as_c_char_ptr(), value.len());
447+
}
448+
}
449+
444450
pub(crate) fn set_dllimport_storage_class<'ll>(v: &'ll Value) {
445451
unsafe {
446452
LLVMSetDLLStorageClass(v, DLLStorageClass::DllImport);

compiler/rustc_codegen_llvm/src/mono_item.rs

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -83,33 +83,56 @@ impl<'tcx> PreDefineCodegenMethods<'tcx> for CodegenCx<'_, 'tcx> {
8383

8484
let symbol_name = self.tcx.symbol_name(instance);
8585
if symbol_name.name.contains("__rdl_alloc") {
86-
self.weak_alias(lldecl, &mangle_internal_symbol(self.tcx, "__rust_alloc"));
86+
self.weak_alias(
87+
lldecl,
88+
symbol_name.name,
89+
&mangle_internal_symbol(self.tcx, "__rust_alloc"),
90+
);
8791
}
8892
if symbol_name.name.contains("__rdl_dealloc") {
89-
self.weak_alias(lldecl, &mangle_internal_symbol(self.tcx, "__rust_dealloc"));
93+
self.weak_alias(
94+
lldecl,
95+
symbol_name.name,
96+
&mangle_internal_symbol(self.tcx, "__rust_dealloc"),
97+
);
9098
}
9199
if symbol_name.name.contains("__rdl_realloc") {
92-
self.weak_alias(lldecl, &mangle_internal_symbol(self.tcx, "__rust_realloc"));
100+
self.weak_alias(
101+
lldecl,
102+
symbol_name.name,
103+
&mangle_internal_symbol(self.tcx, "__rust_realloc"),
104+
);
93105
}
94106
if symbol_name.name.contains("__rdl_alloc_zeroed") {
95-
self.weak_alias(lldecl, &mangle_internal_symbol(self.tcx, "__rust_alloc_zeroed"));
107+
self.weak_alias(
108+
lldecl,
109+
symbol_name.name,
110+
&mangle_internal_symbol(self.tcx, "__rust_alloc_zeroed"),
111+
);
96112
}
97113

98114
self.instances.borrow_mut().insert(instance, lldecl);
99115
}
100116

101-
fn weak_alias(&self, aliasee: Self::Function, name: &str) {
102-
let ty = self.get_type_of_global(aliasee);
103-
let alias = llvm::add_alias(
104-
self.llmod,
105-
ty,
106-
AddressSpace::DATA,
107-
aliasee,
108-
&CString::new(name).unwrap(),
109-
);
110-
111-
llvm::set_linkage(alias, llvm::Linkage::WeakAnyLinkage);
112-
self.add_compiler_used_global(alias);
117+
fn weak_alias(&self, aliasee: Self::Function, aliasee_name: &str, name: &str) {
118+
if self.tcx.sess.target.is_like_msvc {
119+
llvm::add_module_linker_option(
120+
self.llmod,
121+
&format!("/alternatename:{name}={aliasee_name}"),
122+
);
123+
} else {
124+
let ty = self.get_type_of_global(aliasee);
125+
let alias = llvm::add_alias(
126+
self.llmod,
127+
ty,
128+
AddressSpace::DATA,
129+
aliasee,
130+
&CString::new(name).unwrap(),
131+
);
132+
133+
llvm::set_linkage(alias, llvm::Linkage::WeakAnyLinkage);
134+
self.add_compiler_used_global(alias);
135+
}
113136
}
114137
}
115138

compiler/rustc_codegen_ssa/src/traits/declare.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,5 @@ pub trait PreDefineCodegenMethods<'tcx>: BackendTypes {
2020
symbol_name: &str,
2121
);
2222

23-
fn weak_alias(&self, aliasee: Self::Function, name: &str);
23+
fn weak_alias(&self, aliasee: Self::Function, aliasee_name: &str, name: &str);
2424
}

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,15 @@ extern "C" void LLVMRustAddModuleFlagString(
906906
MDString::get(unwrap(M)->getContext(), StringRef(Value, ValueLen)));
907907
}
908908

909+
extern "C" void LLVMRustAddLinkerOptions(LLVMModuleRef M, const char *Value,
910+
size_t ValueLen) {
911+
912+
auto *Opts = unwrap(M)->getOrInsertNamedMetadata("llvm.linker.options");
913+
Opts->addOperand(MDNode::get(
914+
unwrap(M)->getContext(),
915+
{MDString::get(unwrap(M)->getContext(), StringRef(Value, ValueLen))}));
916+
}
917+
909918
extern "C" LLVMValueRef LLVMRustGetLastInstruction(LLVMBasicBlockRef BB) {
910919
auto Point = unwrap(BB)->rbegin();
911920
if (Point != unwrap(BB)->rend())

0 commit comments

Comments
 (0)