Treat extern in compiler-builtins as used
We have to preserve the symbols of the built-in functions during LTO.
This commit is contained in:
parent
665da1ed32
commit
b592f29a8e
@ -54,8 +54,8 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, _: LocalCrate) -> DefIdMap<S
|
|||||||
// export level, however, as they're just implementation details.
|
// export level, however, as they're just implementation details.
|
||||||
// Down below we'll hardwire all of the symbols to the `Rust` export
|
// Down below we'll hardwire all of the symbols to the `Rust` export
|
||||||
// level instead.
|
// level instead.
|
||||||
let special_runtime_crate =
|
let is_compiler_builtins = tcx.is_compiler_builtins(LOCAL_CRATE);
|
||||||
tcx.is_panic_runtime(LOCAL_CRATE) || tcx.is_compiler_builtins(LOCAL_CRATE);
|
let special_runtime_crate = tcx.is_panic_runtime(LOCAL_CRATE) || is_compiler_builtins;
|
||||||
|
|
||||||
let mut reachable_non_generics: DefIdMap<_> = tcx
|
let mut reachable_non_generics: DefIdMap<_> = tcx
|
||||||
.reachable_set(())
|
.reachable_set(())
|
||||||
@ -107,7 +107,11 @@ fn reachable_non_generics_provider(tcx: TyCtxt<'_>, _: LocalCrate) -> DefIdMap<S
|
|||||||
.map(|def_id| {
|
.map(|def_id| {
|
||||||
// We won't link right if this symbol is stripped during LTO.
|
// We won't link right if this symbol is stripped during LTO.
|
||||||
let name = tcx.symbol_name(Instance::mono(tcx, def_id.to_def_id())).name;
|
let name = tcx.symbol_name(Instance::mono(tcx, def_id.to_def_id())).name;
|
||||||
let used = name == "rust_eh_personality";
|
// We have to preserve the symbols of the built-in functions during LTO.
|
||||||
|
let is_builtin_fn = is_compiler_builtins
|
||||||
|
&& symbol_export_level(tcx, def_id.to_def_id())
|
||||||
|
.is_below_threshold(SymbolExportLevel::C);
|
||||||
|
let used = is_builtin_fn || name == "rust_eh_personality";
|
||||||
|
|
||||||
let export_level = if special_runtime_crate {
|
let export_level = if special_runtime_crate {
|
||||||
SymbolExportLevel::Rust
|
SymbolExportLevel::Rust
|
||||||
|
@ -1120,102 +1120,6 @@ extern "C" void LLVMRustPrintPasses() {
|
|||||||
PB.printPassNames(outs());
|
PB.printPassNames(outs());
|
||||||
}
|
}
|
||||||
|
|
||||||
// from https://github.com/llvm/llvm-project/blob/7021182d6b43de9488ab70de626192ce70b3a4a6/llvm/lib/Object/IRSymtab.cpp#L48-L57
|
|
||||||
static const char *PreservedLibcallSymbols[] = {
|
|
||||||
#define HANDLE_LIBCALL(code, name) name,
|
|
||||||
#include "llvm/IR/RuntimeLibcalls.def"
|
|
||||||
#undef HANDLE_LIBCALL
|
|
||||||
// RuntimeLibcalls.def missing symbols.
|
|
||||||
"__ctzsi2",
|
|
||||||
"__ctzdi2",
|
|
||||||
"__ctzti2",
|
|
||||||
"__ffssi2",
|
|
||||||
"__ffsdi2",
|
|
||||||
"__ffsti2",
|
|
||||||
"__paritysi2",
|
|
||||||
"__paritydi2",
|
|
||||||
"__parityti2",
|
|
||||||
"__popcountsi2",
|
|
||||||
"__popcountdi2",
|
|
||||||
"__popcountti2",
|
|
||||||
"__bswapsi2",
|
|
||||||
"__bswapdi2",
|
|
||||||
"__negti2",
|
|
||||||
"__udivmoddi4",
|
|
||||||
"__udivmodti4",
|
|
||||||
"__udivmodsi4",
|
|
||||||
"__divmodsi4",
|
|
||||||
"__divmoddi4",
|
|
||||||
"__divmodti4",
|
|
||||||
"__absvsi2",
|
|
||||||
"__absvdi2",
|
|
||||||
"__absvti2",
|
|
||||||
"__negvsi2",
|
|
||||||
"__negvdi2",
|
|
||||||
"__negvti2",
|
|
||||||
"__addvsi3",
|
|
||||||
"__addvdi3",
|
|
||||||
"__addvti3",
|
|
||||||
"__subvsi3",
|
|
||||||
"__subvdi3",
|
|
||||||
"__subvti3",
|
|
||||||
"__mulvsi3",
|
|
||||||
"__mulvdi3",
|
|
||||||
"__mulvti3",
|
|
||||||
"__cmpdi2",
|
|
||||||
"__cmpti2",
|
|
||||||
"__ucmpdi2",
|
|
||||||
"__ucmpti2",
|
|
||||||
"__mulsc3",
|
|
||||||
"__muldc3",
|
|
||||||
"__mulxc3",
|
|
||||||
"__multc3",
|
|
||||||
"__divsc3",
|
|
||||||
"__divdc3",
|
|
||||||
"__divxc3",
|
|
||||||
"__divtc3",
|
|
||||||
"__clear_cache",
|
|
||||||
"__enable_execute_stack",
|
|
||||||
"__gcc_personality_v0",
|
|
||||||
"__eprintf",
|
|
||||||
"__emutls_get_address",
|
|
||||||
"__trampoline_setup",
|
|
||||||
"__addsf3vfp",
|
|
||||||
"__adddf3vfp",
|
|
||||||
"__divsf3vfp",
|
|
||||||
"__divdf3vfp",
|
|
||||||
"__eqsf2vfp",
|
|
||||||
"__eqdf2vfp",
|
|
||||||
"__extendsfdf2vfp",
|
|
||||||
"__fixdfsivfp",
|
|
||||||
"__fixsfsivfp",
|
|
||||||
"__fixunssfsivfp",
|
|
||||||
"__fixunsdfsivfp",
|
|
||||||
"__floatsidfvfp",
|
|
||||||
"__floatsisfvfp",
|
|
||||||
"__floatunssidfvfp",
|
|
||||||
"__floatunssisfvfp",
|
|
||||||
"__gedf2vfp",
|
|
||||||
"__gesf2vfp",
|
|
||||||
"__gtdf2vfp",
|
|
||||||
"__gtsf2vfp",
|
|
||||||
"__ledf2vfp",
|
|
||||||
"__lesf2vfp",
|
|
||||||
"__ltdf2vfp",
|
|
||||||
"__ltsf2vfp",
|
|
||||||
"__muldf3vfp",
|
|
||||||
"__mulsf3vfp",
|
|
||||||
"__nedf2vfp",
|
|
||||||
"__negdf2vfp",
|
|
||||||
"__negsf2vfp",
|
|
||||||
"__negsf2vfp",
|
|
||||||
"__subdf3vfp",
|
|
||||||
"__subsf3vfp",
|
|
||||||
"__truncdfsf2vfp",
|
|
||||||
"__unorddf2vfp",
|
|
||||||
"__unordsf2vfp",
|
|
||||||
};
|
|
||||||
|
|
||||||
extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
|
extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
|
||||||
size_t Len) {
|
size_t Len) {
|
||||||
auto PreserveFunctions = [=](const GlobalValue &GV) {
|
auto PreserveFunctions = [=](const GlobalValue &GV) {
|
||||||
@ -1231,7 +1135,7 @@ extern "C" void LLVMRustRunRestrictionPass(LLVMModuleRef M, char **Symbols,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return llvm::is_contained(PreservedLibcallSymbols, GV.getName());
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
internalizeModule(*unwrap(M), PreserveFunctions);
|
internalizeModule(*unwrap(M), PreserveFunctions);
|
||||||
@ -1389,12 +1293,6 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
|
|||||||
auto GUID = GlobalValue::getGUID(preserved_symbols[i]);
|
auto GUID = GlobalValue::getGUID(preserved_symbols[i]);
|
||||||
Ret->GUIDPreservedSymbols.insert(GUID);
|
Ret->GUIDPreservedSymbols.insert(GUID);
|
||||||
}
|
}
|
||||||
for (int i = 0; i < sizeof(PreservedLibcallSymbols) / sizeof(PreservedLibcallSymbols[0]); i++) {
|
|
||||||
if (auto *PreservedLibcallSymbol = PreservedLibcallSymbols[i]) {
|
|
||||||
auto GUID = GlobalValue::getGUID(PreservedLibcallSymbol);
|
|
||||||
Ret->GUIDPreservedSymbols.insert(GUID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect the import/export lists for all modules from the call-graph in the
|
// Collect the import/export lists for all modules from the call-graph in the
|
||||||
// combined index
|
// combined index
|
||||||
|
Loading…
Reference in New Issue
Block a user