@@ -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
4748static 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