// TheTriple defaults to ELF, and COFF doesn't have an environment:
// the best we can do here is indicate that it is mach-o.
if (Obj->isMachO())
- TheTriple.setEnvironment(Triple::MachO);
+ TheTriple.setObjectFormat(Triple::MachO);
}
} else
TheTriple.setTriple(Triple::normalize(TripleName));
std::unique_ptr<MCSymbolizer> Symzer(
MCObjectSymbolizer::createObjectSymbolizer(*Ctx.get(), RelInfo, Obj));
if (Symzer)
- DisAsm->setSymbolizer(Symzer);
+ DisAsm->setSymbolizer(std::move(Symzer));
}
}
// Create a mapping, RelocSecs = SectionRelocMap[S], where sections
// in RelocSecs contain the relocations for section S.
error_code EC;
- std::map<SectionRef, SmallVector<SectionRef, 1> > SectionRelocMap;
- for (section_iterator I = Obj->section_begin(), E = Obj->section_end();
- I != E; ++I) {
- section_iterator Sec2 = I->getRelocatedSection();
+ std::map<SectionRef, SmallVector<SectionRef, 1>> SectionRelocMap;
+ for (const SectionRef &Section : Obj->sections()) {
+ section_iterator Sec2 = Section.getRelocatedSection();
if (Sec2 != Obj->section_end())
- SectionRelocMap[*Sec2].push_back(*I);
+ SectionRelocMap[*Sec2].push_back(Section);
}
- for (section_iterator I = Obj->section_begin(), E = Obj->section_end();
- I != E; ++I) {
+ for (const SectionRef &Section : Obj->sections()) {
bool Text;
- if (error(I->isText(Text)))
+ if (error(Section.isText(Text)))
break;
if (!Text)
continue;
uint64_t SectionAddr;
- if (error(I->getAddress(SectionAddr)))
+ if (error(Section.getAddress(SectionAddr)))
break;
uint64_t SectSize;
- if (error(I->getSize(SectSize)))
+ if (error(Section.getSize(SectSize)))
break;
// Make a list of all the symbols in this section.
- std::vector<std::pair<uint64_t, StringRef> > Symbols;
- for (symbol_iterator SI = Obj->symbol_begin(), SE = Obj->symbol_end();
- SI != SE; ++SI) {
+ std::vector<std::pair<uint64_t, StringRef>> Symbols;
+ for (const SymbolRef &Symbol : Obj->symbols()) {
bool contains;
- if (!error(I->containsSymbol(*SI, contains)) && contains) {
+ if (!error(Section.containsSymbol(Symbol, contains)) && contains) {
uint64_t Address;
- if (error(SI->getAddress(Address)))
+ if (error(Symbol.getAddress(Address)))
break;
if (Address == UnknownAddressOrSize)
continue;
continue;
StringRef Name;
- if (error(SI->getName(Name)))
+ if (error(Symbol.getName(Name)))
break;
Symbols.push_back(std::make_pair(Address, Name));
}
// Make a list of all the relocations for this section.
std::vector<RelocationRef> Rels;
if (InlineRelocs) {
- SmallVectorImpl<SectionRef> *RelocSecs = &SectionRelocMap[*I];
- for (SmallVectorImpl<SectionRef>::iterator RelocSec = RelocSecs->begin(),
- E = RelocSecs->end();
- RelocSec != E; ++RelocSec) {
- for (relocation_iterator RI = RelocSec->relocation_begin(),
- RE = RelocSec->relocation_end();
- RI != RE; ++RI)
- Rels.push_back(*RI);
+ for (const SectionRef &RelocSec : SectionRelocMap[Section]) {
+ for (const RelocationRef &Reloc : RelocSec.relocations()) {
+ Rels.push_back(Reloc);
+ }
}
}
StringRef SegmentName = "";
if (const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj)) {
- DataRefImpl DR = I->getRawDataRefImpl();
+ DataRefImpl DR = Section.getRawDataRefImpl();
SegmentName = MachO->getSectionFinalSegmentName(DR);
}
StringRef name;
- if (error(I->getName(name)))
+ if (error(Section.getName(name)))
break;
outs() << "Disassembly of section ";
if (!SegmentName.empty())
raw_svector_ostream CommentStream(Comments);
StringRef Bytes;
- if (error(I->getContents(Bytes)))
+ if (error(Section.getContents(Bytes)))
break;
StringRefMemoryObject memoryObject(Bytes, SectionAddr);
uint64_t Size;
}
}
-static void PrintRelocations(const ObjectFile *o) {
- for (section_iterator si = o->section_begin(), se = o->section_end();
- si != se; ++si) {
- if (si->relocation_begin() == si->relocation_end())
+static void PrintRelocations(const ObjectFile *Obj) {
+ for (const SectionRef &Section : Obj->sections()) {
+ if (Section.relocation_begin() == Section.relocation_end())
continue;
StringRef secname;
- if (error(si->getName(secname))) continue;
+ if (error(Section.getName(secname)))
+ continue;
outs() << "RELOCATION RECORDS FOR [" << secname << "]:\n";
- for (relocation_iterator ri = si->relocation_begin(),
- re = si->relocation_end();
- ri != re; ++ri) {
+ for (const RelocationRef &Reloc : Section.relocations()) {
bool hidden;
uint64_t address;
SmallString<32> relocname;
SmallString<32> valuestr;
- if (error(ri->getHidden(hidden))) continue;
- if (hidden) continue;
- if (error(ri->getTypeName(relocname))) continue;
- if (error(ri->getOffset(address))) continue;
- if (error(ri->getValueString(valuestr))) continue;
+ if (error(Reloc.getHidden(hidden)))
+ continue;
+ if (hidden)
+ continue;
+ if (error(Reloc.getTypeName(relocname)))
+ continue;
+ if (error(Reloc.getOffset(address)))
+ continue;
+ if (error(Reloc.getValueString(valuestr)))
+ continue;
outs() << address << " " << relocname << " " << valuestr << "\n";
}
outs() << "\n";
}
}
-static void PrintSectionHeaders(const ObjectFile *o) {
+static void PrintSectionHeaders(const ObjectFile *Obj) {
outs() << "Sections:\n"
"Idx Name Size Address Type\n";
unsigned i = 0;
- for (section_iterator si = o->section_begin(), se = o->section_end();
- si != se; ++si) {
+ for (const SectionRef &Section : Obj->sections()) {
StringRef Name;
- if (error(si->getName(Name)))
+ if (error(Section.getName(Name)))
return;
uint64_t Address;
- if (error(si->getAddress(Address))) return;
+ if (error(Section.getAddress(Address)))
+ return;
uint64_t Size;
- if (error(si->getSize(Size))) return;
+ if (error(Section.getSize(Size)))
+ return;
bool Text, Data, BSS;
- if (error(si->isText(Text))) return;
- if (error(si->isData(Data))) return;
- if (error(si->isBSS(BSS))) return;
+ if (error(Section.isText(Text)))
+ return;
+ if (error(Section.isData(Data)))
+ return;
+ if (error(Section.isBSS(BSS)))
+ return;
std::string Type = (std::string(Text ? "TEXT " : "") +
(Data ? "DATA " : "") + (BSS ? "BSS" : ""));
- outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %s\n",
- i, Name.str().c_str(), Size, Address, Type.c_str());
+ outs() << format("%3d %-13s %08" PRIx64 " %016" PRIx64 " %s\n", i,
+ Name.str().c_str(), Size, Address, Type.c_str());
++i;
}
}
-static void PrintSectionContents(const ObjectFile *o) {
+static void PrintSectionContents(const ObjectFile *Obj) {
error_code EC;
- for (section_iterator si = o->section_begin(), se = o->section_end();
- si != se; ++si) {
+ for (const SectionRef &Section : Obj->sections()) {
StringRef Name;
StringRef Contents;
uint64_t BaseAddr;
bool BSS;
- if (error(si->getName(Name))) continue;
- if (error(si->getContents(Contents))) continue;
- if (error(si->getAddress(BaseAddr))) continue;
- if (error(si->isBSS(BSS))) continue;
+ if (error(Section.getName(Name)))
+ continue;
+ if (error(Section.getContents(Contents)))
+ continue;
+ if (error(Section.getAddress(BaseAddr)))
+ continue;
+ if (error(Section.isBSS(BSS)))
+ continue;
outs() << "Contents of section " << Name << ":\n";
if (BSS) {
for (int i = 0, e = header->NumberOfSymbols; i != e; ++i) {
if (aux_count--) {
// Figure out which type of aux this is.
- if (symbol->StorageClass == COFF::IMAGE_SYM_CLASS_STATIC
- && symbol->Value == 0) { // Section definition.
+ if (symbol->isSectionDefinition()) { // Section definition.
const coff_aux_section_definition *asd;
if (error(coff->getAuxSymbol<coff_aux_section_definition>(i, asd)))
return;
static void PrintSymbolTable(const ObjectFile *o) {
outs() << "SYMBOL TABLE:\n";
- if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o))
+ if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o)) {
PrintCOFFSymbolTable(coff);
- else {
- for (symbol_iterator si = o->symbol_begin(), se = o->symbol_end();
- si != se; ++si) {
- StringRef Name;
- uint64_t Address;
- SymbolRef::Type Type;
- uint64_t Size;
- uint32_t Flags = si->getFlags();
- section_iterator Section = o->section_end();
- if (error(si->getName(Name))) continue;
- if (error(si->getAddress(Address))) continue;
- if (error(si->getType(Type))) continue;
- if (error(si->getSize(Size))) continue;
- if (error(si->getSection(Section))) continue;
-
- bool Global = Flags & SymbolRef::SF_Global;
- bool Weak = Flags & SymbolRef::SF_Weak;
- bool Absolute = Flags & SymbolRef::SF_Absolute;
-
- if (Address == UnknownAddressOrSize)
- Address = 0;
- if (Size == UnknownAddressOrSize)
- Size = 0;
- char GlobLoc = ' ';
- if (Type != SymbolRef::ST_Unknown)
- GlobLoc = Global ? 'g' : 'l';
- char Debug = (Type == SymbolRef::ST_Debug || Type == SymbolRef::ST_File)
- ? 'd' : ' ';
- char FileFunc = ' ';
- if (Type == SymbolRef::ST_File)
- FileFunc = 'f';
- else if (Type == SymbolRef::ST_Function)
- FileFunc = 'F';
-
- const char *Fmt = o->getBytesInAddress() > 4 ? "%016" PRIx64 :
- "%08" PRIx64;
-
- outs() << format(Fmt, Address) << " "
- << GlobLoc // Local -> 'l', Global -> 'g', Neither -> ' '
- << (Weak ? 'w' : ' ') // Weak?
- << ' ' // Constructor. Not supported yet.
- << ' ' // Warning. Not supported yet.
- << ' ' // Indirect reference to another symbol.
- << Debug // Debugging (d) or dynamic (D) symbol.
- << FileFunc // Name of function (F), file (f) or object (O).
- << ' ';
- if (Absolute)
- outs() << "*ABS*";
- else if (Section == o->section_end())
- outs() << "*UND*";
- else {
- if (const MachOObjectFile *MachO =
- dyn_cast<const MachOObjectFile>(o)) {
- DataRefImpl DR = Section->getRawDataRefImpl();
- StringRef SegmentName = MachO->getSectionFinalSegmentName(DR);
- outs() << SegmentName << ",";
- }
- StringRef SectionName;
- if (error(Section->getName(SectionName)))
- SectionName = "";
- outs() << SectionName;
+ return;
+ }
+ for (const SymbolRef &Symbol : o->symbols()) {
+ StringRef Name;
+ uint64_t Address;
+ SymbolRef::Type Type;
+ uint64_t Size;
+ uint32_t Flags = Symbol.getFlags();
+ section_iterator Section = o->section_end();
+ if (error(Symbol.getName(Name)))
+ continue;
+ if (error(Symbol.getAddress(Address)))
+ continue;
+ if (error(Symbol.getType(Type)))
+ continue;
+ if (error(Symbol.getSize(Size)))
+ continue;
+ if (error(Symbol.getSection(Section)))
+ continue;
+
+ bool Global = Flags & SymbolRef::SF_Global;
+ bool Weak = Flags & SymbolRef::SF_Weak;
+ bool Absolute = Flags & SymbolRef::SF_Absolute;
+
+ if (Address == UnknownAddressOrSize)
+ Address = 0;
+ if (Size == UnknownAddressOrSize)
+ Size = 0;
+ char GlobLoc = ' ';
+ if (Type != SymbolRef::ST_Unknown)
+ GlobLoc = Global ? 'g' : 'l';
+ char Debug = (Type == SymbolRef::ST_Debug || Type == SymbolRef::ST_File)
+ ? 'd' : ' ';
+ char FileFunc = ' ';
+ if (Type == SymbolRef::ST_File)
+ FileFunc = 'f';
+ else if (Type == SymbolRef::ST_Function)
+ FileFunc = 'F';
+
+ const char *Fmt = o->getBytesInAddress() > 4 ? "%016" PRIx64 :
+ "%08" PRIx64;
+
+ outs() << format(Fmt, Address) << " "
+ << GlobLoc // Local -> 'l', Global -> 'g', Neither -> ' '
+ << (Weak ? 'w' : ' ') // Weak?
+ << ' ' // Constructor. Not supported yet.
+ << ' ' // Warning. Not supported yet.
+ << ' ' // Indirect reference to another symbol.
+ << Debug // Debugging (d) or dynamic (D) symbol.
+ << FileFunc // Name of function (F), file (f) or object (O).
+ << ' ';
+ if (Absolute) {
+ outs() << "*ABS*";
+ } else if (Section == o->section_end()) {
+ outs() << "*UND*";
+ } else {
+ if (const MachOObjectFile *MachO =
+ dyn_cast<const MachOObjectFile>(o)) {
+ DataRefImpl DR = Section->getRawDataRefImpl();
+ StringRef SegmentName = MachO->getSectionFinalSegmentName(DR);
+ outs() << SegmentName << ",";
}
- outs() << '\t'
- << format("%08" PRIx64 " ", Size)
- << Name
- << '\n';
+ StringRef SectionName;
+ if (error(Section->getName(SectionName)))
+ SectionName = "";
+ outs() << SectionName;
}
+ outs() << '\t'
+ << format("%08" PRIx64 " ", Size)
+ << Name
+ << '\n';
}
}