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 {
|
} else {
|
||||||
"\x01__imp_"
|
"\x01__imp_"
|
||||||
};
|
};
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
let i8p_ty = Type::i8p_llcx(llcx);
|
let i8p_ty = Type::i8p_llcx(llcx);
|
||||||
let globals = base::iter_globals(llmod)
|
let globals = base::iter_globals(llmod)
|
||||||
|
@ -802,14 +803,23 @@ fn create_msvc_imps(
|
||||||
llvm::LLVMRustGetLinkage(val) == llvm::Linkage::ExternalLinkage &&
|
llvm::LLVMRustGetLinkage(val) == llvm::Linkage::ExternalLinkage &&
|
||||||
llvm::LLVMIsDeclaration(val) == 0
|
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));
|
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();
|
let mut imp_name = prefix.as_bytes().to_vec();
|
||||||
imp_name.extend(name.to_bytes());
|
imp_name.extend(name.to_bytes());
|
||||||
let imp_name = CString::new(imp_name).unwrap();
|
let imp_name = CString::new(imp_name).unwrap();
|
||||||
(imp_name, val)
|
(imp_name, val)
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
for (imp_name, val) in globals {
|
for (imp_name, val) in globals {
|
||||||
let imp = llvm::LLVMAddGlobal(llmod,
|
let imp = llvm::LLVMAddGlobal(llmod,
|
||||||
i8p_ty,
|
i8p_ty,
|
||||||
|
@ -818,4 +828,10 @@ fn create_msvc_imps(
|
||||||
llvm::LLVMRustSetLinkage(imp, llvm::Linkage::ExternalLinkage);
|
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