mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-22 10:24:26 +00:00
Rewrite DIContext interface to take an object. Update all callers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@167757 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -69,100 +69,8 @@ static void DumpInput(const StringRef &Filename) {
|
||||
}
|
||||
|
||||
OwningPtr<ObjectFile> Obj(ObjectFile::createObjectFile(Buff.take()));
|
||||
OwningPtr<DIContext> dictx(DIContext::getDWARFContext(Obj.get()));
|
||||
|
||||
StringRef DebugInfoSection;
|
||||
RelocAddrMap RelocMap;
|
||||
StringRef DebugAbbrevSection;
|
||||
StringRef DebugLineSection;
|
||||
StringRef DebugArangesSection;
|
||||
StringRef DebugStringSection;
|
||||
StringRef DebugRangesSection;
|
||||
|
||||
error_code ec;
|
||||
for (section_iterator i = Obj->begin_sections(),
|
||||
e = Obj->end_sections();
|
||||
i != e; i.increment(ec)) {
|
||||
StringRef name;
|
||||
i->getName(name);
|
||||
StringRef data;
|
||||
i->getContents(data);
|
||||
|
||||
if (name.startswith("__DWARF,"))
|
||||
name = name.substr(8); // Skip "__DWARF," prefix.
|
||||
name = name.substr(name.find_first_not_of("._")); // Skip . and _ prefixes.
|
||||
if (name == "debug_info")
|
||||
DebugInfoSection = data;
|
||||
else if (name == "debug_abbrev")
|
||||
DebugAbbrevSection = data;
|
||||
else if (name == "debug_line")
|
||||
DebugLineSection = data;
|
||||
else if (name == "debug_aranges")
|
||||
DebugArangesSection = data;
|
||||
else if (name == "debug_str")
|
||||
DebugStringSection = data;
|
||||
else if (name == "debug_ranges")
|
||||
DebugRangesSection = data;
|
||||
// Any more debug info sections go here.
|
||||
else
|
||||
continue;
|
||||
|
||||
// TODO: For now only handle relocations for the debug_info section.
|
||||
if (name != "debug_info")
|
||||
continue;
|
||||
|
||||
if (i->begin_relocations() != i->end_relocations()) {
|
||||
uint64_t SectionSize;
|
||||
i->getSize(SectionSize);
|
||||
for (relocation_iterator reloc_i = i->begin_relocations(),
|
||||
reloc_e = i->end_relocations();
|
||||
reloc_i != reloc_e; reloc_i.increment(ec)) {
|
||||
uint64_t Address;
|
||||
reloc_i->getAddress(Address);
|
||||
uint64_t Type;
|
||||
reloc_i->getType(Type);
|
||||
|
||||
RelocVisitor V(Obj->getFileFormatName());
|
||||
// The section address is always 0 for debug sections.
|
||||
RelocToApply R(V.visit(Type, *reloc_i));
|
||||
if (V.error()) {
|
||||
SmallString<32> Name;
|
||||
error_code ec(reloc_i->getTypeName(Name));
|
||||
if (ec) {
|
||||
errs() << "Aaaaaa! Nameless relocation! Aaaaaa!\n";
|
||||
}
|
||||
errs() << "error: failed to compute relocation: "
|
||||
<< Name << "\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Address + R.Width > SectionSize) {
|
||||
errs() << "error: " << R.Width << "-byte relocation starting "
|
||||
<< Address << " bytes into section " << name << " which is "
|
||||
<< SectionSize << " bytes long.\n";
|
||||
continue;
|
||||
}
|
||||
if (R.Width > 8) {
|
||||
errs() << "error: can't handle a relocation of more than 8 bytes at "
|
||||
"a time.\n";
|
||||
continue;
|
||||
}
|
||||
DEBUG(dbgs() << "Writing " << format("%p", R.Value)
|
||||
<< " at " << format("%p", Address)
|
||||
<< " with width " << format("%d", R.Width)
|
||||
<< "\n");
|
||||
RelocMap[Address] = std::make_pair(R.Width, R.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OwningPtr<DIContext> dictx(DIContext::getDWARFContext(/*FIXME*/true,
|
||||
DebugInfoSection,
|
||||
DebugAbbrevSection,
|
||||
DebugArangesSection,
|
||||
DebugLineSection,
|
||||
DebugStringSection,
|
||||
DebugRangesSection,
|
||||
&RelocMap));
|
||||
if (Address == -1ULL) {
|
||||
outs() << Filename
|
||||
<< ":\tfile format " << Obj->getFileFormatName() << "\n\n";
|
||||
|
Reference in New Issue
Block a user