mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
LowerTypeTests: Propagate symver directives
Summary: This change fixes https://crbug.com/834474, a build failure caused by LowerTypeTests not preserving .symver symbol versioning directives for exported functions. Emit symver information to ThinLTO summary data and then propagate symver directives for exported functions to the merged module. Emitting symver information to the summaries increases the size of intermediate build artifacts for a Chromium build by less than 0.2%. Reviewers: pcc Reviewed By: pcc Subscribers: tejohnson, mehdi_amini, eraman, llvm-commits, eugenis, kcc Differential Revision: https://reviews.llvm.org/D45798 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@330387 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -68,9 +68,9 @@ void ModuleSymbolTable::addModule(Module *M) {
|
||||
});
|
||||
}
|
||||
|
||||
void ModuleSymbolTable::CollectAsmSymbols(
|
||||
const Module &M,
|
||||
function_ref<void(StringRef, BasicSymbolRef::Flags)> AsmSymbol) {
|
||||
static void
|
||||
initializeRecordStreamer(const Module &M,
|
||||
function_ref<void(RecordStreamer &)> Init) {
|
||||
StringRef InlineAsm = M.getModuleInlineAsm();
|
||||
if (InlineAsm.empty())
|
||||
return;
|
||||
@@ -119,36 +119,53 @@ void ModuleSymbolTable::CollectAsmSymbols(
|
||||
if (Parser->Run(false))
|
||||
return;
|
||||
|
||||
Streamer.flushSymverDirectives();
|
||||
Init(Streamer);
|
||||
}
|
||||
|
||||
for (auto &KV : Streamer) {
|
||||
StringRef Key = KV.first();
|
||||
RecordStreamer::State Value = KV.second;
|
||||
// FIXME: For now we just assume that all asm symbols are executable.
|
||||
uint32_t Res = BasicSymbolRef::SF_Executable;
|
||||
switch (Value) {
|
||||
case RecordStreamer::NeverSeen:
|
||||
llvm_unreachable("NeverSeen should have been replaced earlier");
|
||||
case RecordStreamer::DefinedGlobal:
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::Defined:
|
||||
break;
|
||||
case RecordStreamer::Global:
|
||||
case RecordStreamer::Used:
|
||||
Res |= BasicSymbolRef::SF_Undefined;
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::DefinedWeak:
|
||||
Res |= BasicSymbolRef::SF_Weak;
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::UndefinedWeak:
|
||||
Res |= BasicSymbolRef::SF_Weak;
|
||||
Res |= BasicSymbolRef::SF_Undefined;
|
||||
void ModuleSymbolTable::CollectAsmSymbols(
|
||||
const Module &M,
|
||||
function_ref<void(StringRef, BasicSymbolRef::Flags)> AsmSymbol) {
|
||||
initializeRecordStreamer(M, [&](RecordStreamer &Streamer) {
|
||||
Streamer.flushSymverDirectives();
|
||||
|
||||
for (auto &KV : Streamer) {
|
||||
StringRef Key = KV.first();
|
||||
RecordStreamer::State Value = KV.second;
|
||||
// FIXME: For now we just assume that all asm symbols are executable.
|
||||
uint32_t Res = BasicSymbolRef::SF_Executable;
|
||||
switch (Value) {
|
||||
case RecordStreamer::NeverSeen:
|
||||
llvm_unreachable("NeverSeen should have been replaced earlier");
|
||||
case RecordStreamer::DefinedGlobal:
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::Defined:
|
||||
break;
|
||||
case RecordStreamer::Global:
|
||||
case RecordStreamer::Used:
|
||||
Res |= BasicSymbolRef::SF_Undefined;
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::DefinedWeak:
|
||||
Res |= BasicSymbolRef::SF_Weak;
|
||||
Res |= BasicSymbolRef::SF_Global;
|
||||
break;
|
||||
case RecordStreamer::UndefinedWeak:
|
||||
Res |= BasicSymbolRef::SF_Weak;
|
||||
Res |= BasicSymbolRef::SF_Undefined;
|
||||
}
|
||||
AsmSymbol(Key, BasicSymbolRef::Flags(Res));
|
||||
}
|
||||
AsmSymbol(Key, BasicSymbolRef::Flags(Res));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void ModuleSymbolTable::CollectAsmSymvers(
|
||||
const Module &M, function_ref<void(StringRef, StringRef)> AsmSymver) {
|
||||
initializeRecordStreamer(M, [&](RecordStreamer &Streamer) {
|
||||
for (auto &KV : Streamer.symverAliases())
|
||||
for (auto &Alias : KV.second)
|
||||
AsmSymver(KV.first->getName(), Alias);
|
||||
});
|
||||
}
|
||||
|
||||
void ModuleSymbolTable::printSymbolName(raw_ostream &OS, Symbol S) const {
|
||||
|
||||
Reference in New Issue
Block a user