FunctionNameKind FNKind,
bool UseSymbolTable) const {
DILineInfo LineInfo;
+
+ if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
+ ModuleOffset.SectionIndex =
+ getModuleSectionIndexForAddress(ModuleOffset.Address);
+
if (DebugInfoContext) {
LineInfo = DebugInfoContext->getLineInfoForAddress(
ModuleOffset, getDILineInfoSpecifier(FNKind));
bool UseSymbolTable) const {
DIInliningInfo InlinedContext;
+ if (ModuleOffset.SectionIndex == object::SectionedAddress::UndefSection)
+ ModuleOffset.SectionIndex =
+ getModuleSectionIndexForAddress(ModuleOffset.Address);
+
if (DebugInfoContext)
InlinedContext = DebugInfoContext->getInliningInfoForAddress(
ModuleOffset, getDILineInfoSpecifier(FNKind));
Res.Start, Res.Size);
return Res;
}
+
+/// Search for the first occurence of specified Address in ObjectFile.
+uint64_t SymbolizableObjectFile::getModuleSectionIndexForAddress(
+ uint64_t Address) const {
+
+ for (SectionRef Sec : Module->sections()) {
+ if (!Sec.isText() || Sec.isVirtual())
+ continue;
+
+ if (Address >= Sec.getAddress() &&
+ Address <= Sec.getAddress() + Sec.getSize()) {
+ return Sec.getIndex();
+ }
+ }
+
+ return object::SectionedAddress::UndefSection;
+}
return !StringRef(pos, offset_length).getAsInteger(0, ModuleOffset);
}
-// This routine returns section index for an address.
-// Assumption: would work ambiguously for object files which have sections not
-// assigned to an address(since the same address could belong to various
-// sections).
-static uint64_t getModuleSectionIndexForAddress(const std::string &ModuleName,
- uint64_t Address) {
-
- // following ModuleName processing was copied from
- // LLVMSymbolizer::getOrCreateModuleInfo().
- // it needs to be refactored to avoid code duplication.
- std::string BinaryName = ModuleName;
- size_t ColonPos = ModuleName.find_last_of(':');
- // Verify that substring after colon form a valid arch name.
- if (ColonPos != std::string::npos) {
- std::string ArchStr = ModuleName.substr(ColonPos + 1);
- if (Triple(ArchStr).getArch() != Triple::UnknownArch) {
- BinaryName = ModuleName.substr(0, ColonPos);
- }
- }
-
- Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(BinaryName);
-
- if (error(BinaryOrErr))
- return object::SectionedAddress::UndefSection;
-
- Binary &Binary = *BinaryOrErr->getBinary();
-
- if (ObjectFile *O = dyn_cast<ObjectFile>(&Binary)) {
- for (SectionRef Sec : O->sections()) {
- if (!Sec.isText() || Sec.isVirtual())
- continue;
-
- if (Address >= Sec.getAddress() &&
- Address <= Sec.getAddress() + Sec.getSize()) {
- return Sec.getIndex();
- }
- }
- }
-
- return object::SectionedAddress::UndefSection;
-}
-
static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer,
DIPrinter &Printer) {
bool IsData = false;
outs() << Delimiter;
}
Offset -= ClAdjustVMA;
- object::SectionedAddress ModuleOffset = {
- Offset, getModuleSectionIndexForAddress(ModuleName, Offset)};
if (IsData) {
- auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
+ auto ResOrErr = Symbolizer.symbolizeData(
+ ModuleName, {Offset, object::SectionedAddress::UndefSection});
Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
} else if (ClPrintInlining) {
- auto ResOrErr =
- Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset, ClDwpName);
+ auto ResOrErr = Symbolizer.symbolizeInlinedCode(
+ ModuleName, {Offset, object::SectionedAddress::UndefSection},
+ ClDwpName);
Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get());
} else {
- auto ResOrErr =
- Symbolizer.symbolizeCode(ModuleName, ModuleOffset, ClDwpName);
+ auto ResOrErr = Symbolizer.symbolizeCode(
+ ModuleName, {Offset, object::SectionedAddress::UndefSection},
+ ClDwpName);
Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get());
}
outs() << "\n";