Exclude profiler-generated symbols from MSVC __imp_-symbol workaround.
This commit is contained in:
parent
3750348daf
commit
724ca0584e
3 changed files with 29 additions and 1 deletions
|
@ -795,6 +795,7 @@ fn create_msvc_imps(
|
|||
} else {
|
||||
"\x01__imp_"
|
||||
};
|
||||
|
||||
unsafe {
|
||||
let i8p_ty = Type::i8p_llcx(llcx);
|
||||
let globals = base::iter_globals(llmod)
|
||||
|
@ -802,14 +803,23 @@ fn create_msvc_imps(
|
|||
llvm::LLVMRustGetLinkage(val) == llvm::Linkage::ExternalLinkage &&
|
||||
llvm::LLVMIsDeclaration(val) == 0
|
||||
})
|
||||
.map(move |val| {
|
||||
.filter_map(|val| {
|
||||
// Exclude some symbols that we know are not Rust symbols.
|
||||
let name = CStr::from_ptr(llvm::LLVMGetValueName(val));
|
||||
if ignored(name.to_bytes()) {
|
||||
None
|
||||
} else {
|
||||
Some((val, name))
|
||||
}
|
||||
})
|
||||
.map(move |(val, name)| {
|
||||
let mut imp_name = prefix.as_bytes().to_vec();
|
||||
imp_name.extend(name.to_bytes());
|
||||
let imp_name = CString::new(imp_name).unwrap();
|
||||
(imp_name, val)
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
for (imp_name, val) in globals {
|
||||
let imp = llvm::LLVMAddGlobal(llmod,
|
||||
i8p_ty,
|
||||
|
@ -818,4 +828,10 @@ fn create_msvc_imps(
|
|||
llvm::LLVMRustSetLinkage(imp, llvm::Linkage::ExternalLinkage);
|
||||
}
|
||||
}
|
||||
|
||||
// Use this function to exclude certain symbols from `__imp` generation.
|
||||
fn ignored(symbol_name: &[u8]) -> bool {
|
||||
// These are symbols generated by LLVM's profiling instrumentation
|
||||
symbol_name.starts_with(b"__llvm_profile_")
|
||||
}
|
||||
}
|
||||
|
|
11
src/test/run-make-fulldeps/pgo-gen-no-imp-symbols/Makefile
Normal file
11
src/test/run-make-fulldeps/pgo-gen-no-imp-symbols/Makefile
Normal file
|
@ -0,0 +1,11 @@
|
|||
-include ../tools.mk
|
||||
|
||||
all:
|
||||
ifeq ($(PROFILER_SUPPORT),1)
|
||||
$(RUSTC) -O -Ccodegen-units=1 -Z pgo-gen="$(TMPDIR)/test.profraw" --emit=llvm-ir test.rs
|
||||
# We expect symbols starting with "__llvm_profile_".
|
||||
$(CGREP) "__llvm_profile_" < $(TMPDIR)/test.ll
|
||||
# We do NOT expect the "__imp_" version of these symbols.
|
||||
$(CGREP) -v "__imp___llvm_profile_" < $(TMPDIR)/test.ll # 64 bit
|
||||
$(CGREP) -v "__imp____llvm_profile_" < $(TMPDIR)/test.ll # 32 bit
|
||||
endif
|
|
@ -0,0 +1 @@
|
|||
fn main() {}
|
Loading…
Add table
Add a link
Reference in a new issue