Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/llvm/llvm-project.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'bolt/lib/Core/BinaryContext.cpp')
-rw-r--r--bolt/lib/Core/BinaryContext.cpp54
1 files changed, 41 insertions, 13 deletions
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 251d3831c019..92ddc2603066 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -1325,14 +1325,13 @@ void BinaryContext::printGlobalSymbols(raw_ostream &OS) const {
}
}
-Expected<unsigned>
-BinaryContext::getDwarfFile(StringRef Directory, StringRef FileName,
- unsigned FileNumber,
- Optional<MD5::MD5Result> Checksum,
- Optional<StringRef> Source, unsigned CUID) {
+Expected<unsigned> BinaryContext::getDwarfFile(
+ StringRef Directory, StringRef FileName, unsigned FileNumber,
+ Optional<MD5::MD5Result> Checksum, Optional<StringRef> Source,
+ unsigned CUID, unsigned DWARFVersion) {
DwarfLineTable &Table = DwarfLineTablesCUMap[CUID];
- return Table.tryGetFile(Directory, FileName, Checksum, Source,
- Ctx->getDwarfVersion(), FileNumber);
+ return Table.tryGetFile(Directory, FileName, Checksum, Source, DWARFVersion,
+ FileNumber);
}
unsigned BinaryContext::addDebugFilenameToUnit(const uint32_t DestCUID,
@@ -1360,7 +1359,9 @@ unsigned BinaryContext::addDebugFilenameToUnit(const uint32_t DestCUID,
dwarf::toString(FileNames[FileIndex - 1].Name))
FileName = *FName;
assert(FileName != "");
- return cantFail(getDwarfFile(Dir, FileName, 0, None, None, DestCUID));
+ DWARFCompileUnit *DstUnit = DwCtx->getCompileUnitForOffset(DestCUID);
+ return cantFail(getDwarfFile(Dir, FileName, 0, None, None, DestCUID,
+ DstUnit->getVersion()));
}
std::vector<BinaryFunction *> BinaryContext::getSortedFunctions() {
@@ -1458,8 +1459,15 @@ void BinaryContext::preprocessDebugInfo() {
if (containsAddress(Range.LowPC))
AllRanges.emplace_back(CURange{Range.LowPC, Range.HighPC, CU.get()});
}
+
+ ContainsDwarf5 |= CU->getVersion() >= 5;
+ ContainsDwarfLegacy |= CU->getVersion() < 5;
}
+ if (ContainsDwarf5 && ContainsDwarfLegacy)
+ llvm::errs() << "BOLT-WARNING: BOLT does not support mix mode binary with "
+ "DWARF5 and DWARF{2,3,4}.\n";
+
std::sort(AllRanges.begin(), AllRanges.end());
for (auto &KV : BinaryFunctions) {
const uint64_t FunctionAddress = KV.first;
@@ -1496,7 +1504,8 @@ void BinaryContext::preprocessDebugInfo() {
StringRef GlobalPrefix = AsmInfo->getPrivateGlobalPrefix();
for (const std::unique_ptr<DWARFUnit> &CU : DwCtx->compile_units()) {
const uint64_t CUID = CU->getOffset();
- getDwarfLineTable(CUID).setLabel(Ctx->getOrCreateSymbol(
+ DwarfLineTable &BinaryLineTable = getDwarfLineTable(CUID);
+ BinaryLineTable.setLabel(Ctx->getOrCreateSymbol(
GlobalPrefix + "line_table_start" + Twine(CUID)));
if (!ProcessedCUs.count(CU.get()))
@@ -1507,26 +1516,45 @@ void BinaryContext::preprocessDebugInfo() {
const std::vector<DWARFDebugLine::FileNameEntry> &FileNames =
LineTable->Prologue.FileNames;
+ uint16_t DwarfVersion = LineTable->Prologue.getVersion();
+ if (DwarfVersion >= 5) {
+ Optional<MD5::MD5Result> Checksum = None;
+ if (LineTable->Prologue.ContentTypes.HasMD5)
+ Checksum = LineTable->Prologue.FileNames[0].Checksum;
+ BinaryLineTable.setRootFile(
+ CU->getCompilationDir(),
+ dwarf::toString(CU->getUnitDIE().find(dwarf::DW_AT_name), nullptr),
+ Checksum, None);
+ }
+
+ BinaryLineTable.setDwarfVersion(DwarfVersion);
+
// Assign a unique label to every line table, one per CU.
// Make sure empty debug line tables are registered too.
if (FileNames.empty()) {
- cantFail(getDwarfFile("", "<unknown>", 0, None, None, CUID));
+ cantFail(
+ getDwarfFile("", "<unknown>", 0, None, None, CUID, DwarfVersion));
continue;
}
+ const uint32_t Offset = DwarfVersion < 5 ? 1 : 0;
for (size_t I = 0, Size = FileNames.size(); I != Size; ++I) {
// Dir indexes start at 1, as DWARF file numbers, and a dir index 0
// means empty dir.
StringRef Dir = "";
- if (FileNames[I].DirIdx != 0)
+ if (FileNames[I].DirIdx != 0 || DwarfVersion >= 5)
if (Optional<const char *> DirName = dwarf::toString(
LineTable->Prologue
- .IncludeDirectories[FileNames[I].DirIdx - 1]))
+ .IncludeDirectories[FileNames[I].DirIdx - Offset]))
Dir = *DirName;
StringRef FileName = "";
if (Optional<const char *> FName = dwarf::toString(FileNames[I].Name))
FileName = *FName;
assert(FileName != "");
- cantFail(getDwarfFile(Dir, FileName, 0, None, None, CUID));
+ Optional<MD5::MD5Result> Checksum = None;
+ if (DwarfVersion >= 5 && LineTable->Prologue.ContentTypes.HasMD5)
+ Checksum = LineTable->Prologue.FileNames[I].Checksum;
+ cantFail(
+ getDwarfFile(Dir, FileName, 0, Checksum, None, CUID, DwarfVersion));
}
}