Skip to content

Commit 57ab1cd

Browse files
committed
Clean-ups
1 parent b707e80 commit 57ab1cd

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

llvm/tools/llvm-profgen/ProfiledBinary.cpp

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,13 @@ cl::opt<bool> ShowSourceLocations("show-source-locations",
3737
cl::desc("Print source locations."),
3838
cl::cat(ProfGenCategory));
3939

40-
cl::opt<bool>
41-
LoadFunctionFromSymbol("load-function-from-symbol", cl::init(true),
42-
cl::desc("Gather additional binary function info "
43-
"from symbols (e.g. .symtab) in case "
44-
"dwarf info is incomplete."),
45-
cl::cat(ProfGenCategory));
40+
cl::opt<bool> LoadFunctionFromSymbol(
41+
"load-function-from-symbol", cl::init(true),
42+
cl::desc(
43+
"Gather additional binary function info from symbols (e.g. .symtab) in "
44+
"case dwarf info is incomplete. Only support binaries in ELF format "
45+
"with pseudo probe, for other formats, this flag will be a no-op."),
46+
cl::cat(ProfGenCategory));
4647

4748
static cl::opt<bool>
4849
ShowCanonicalFnName("show-canonical-fname",
@@ -850,12 +851,17 @@ void ProfiledBinary::loadSymbolsFromSymtab(const ObjectFile *Obj) {
850851
// Compiler/LTO internal
851852
".llvm.", ".part.", ".isra.", ".constprop.", ".lto_priv."});
852853
StringRef FileName = Obj->getFileName();
854+
// Only apply this to ELF binary. e.g. COFF file format doesn't have `size`
855+
// field in the symbol table.
856+
bool IsELFObject = isa<ELFObjectFileBase>(Obj);
857+
if (!IsELFObject)
858+
return;
853859
for (const SymbolRef &Symbol : Obj->symbols()) {
854860
const SymbolRef::Type Type = unwrapOrError(Symbol.getType(), FileName);
855861
const uint64_t StartAddr = unwrapOrError(Symbol.getAddress(), FileName);
856862
const StringRef Name = unwrapOrError(Symbol.getName(), FileName);
857863
uint64_t Size = 0;
858-
if (isa<ELFObjectFileBase>(Symbol.getObject())) {
864+
if (LLVM_LIKELY(IsELFObject)) {
859865
ELFSymbolRef ElfSymbol(Symbol);
860866
Size = ElfSymbol.getSize();
861867
}
@@ -878,7 +884,8 @@ void ProfiledBinary::loadSymbolsFromSymtab(const ObjectFile *Obj) {
878884
auto &Func = Ret.first->second;
879885
if (Ret.second) {
880886
Func.FuncName = Ret.first->first;
881-
HashBinaryFunctions[MD5Hash(StringRef(SymName))] = &Func;
887+
HashBinaryFunctions[Function::getGUIDAssumingExternalLinkage(SymName)] =
888+
&Func;
882889
}
883890

884891
Func.NameStatus = DwarfNameStatus::Missing;
@@ -909,8 +916,8 @@ void ProfiledBinary::loadSymbolsFromSymtab(const ObjectFile *Obj) {
909916
"Mismatched function range");
910917

911918
Range->Func->NameStatus = DwarfNameStatus::Mismatch;
912-
AlternativeFunctionGUIDs.emplace(Range->Func,
913-
MD5Hash(StringRef(SymName)));
919+
AlternativeFunctionGUIDs.emplace(
920+
Range->Func, Function::getGUIDAssumingExternalLinkage(SymName));
914921

915922
} else if (StartAddr != Range->StartAddress &&
916923
EndAddr != Range->EndAddress) {
@@ -923,7 +930,6 @@ void ProfiledBinary::loadSymbolsFromSymtab(const ObjectFile *Obj) {
923930
<< " indicates another range ("
924931
<< format("%8" PRIx64, Range->StartAddress) << ", "
925932
<< format("%8" PRIx64, Range->EndAddress) << ")\n";
926-
llvm_unreachable("invalid function range");
927933
}
928934
}
929935
}

0 commit comments

Comments
 (0)