diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index ed7aabd2c86..da972a2433e 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -44,11 +44,6 @@ public: virtual unsigned getArch() const; virtual StringRef getLoadName() const; - // In a MachO file, sections have a segment name. This is used in the .o - // files. They have a single segment, but this field specifies which segment - // a section should be put in in the final object. - error_code getSectionFinalSegmentName(DataRefImpl Sec, StringRef &Res) const; - MachOObject *getObject() { return MachOObj.get(); } static inline bool classof(const Binary *v) { diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 392563ad194..a38fac78aae 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -473,43 +473,28 @@ static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) { return false; } -static StringRef parseSegmentOrSectionName(const char *P) { - if (P[15] == 0) - // Null terminated. - return P; - // Not null terminated, so this is a 16 char string. - return StringRef(P, 16); -} - error_code MachOObjectFile::getSectionName(DataRefImpl DRI, StringRef &Result) const { + // FIXME: thread safety. + static char result[34]; if (is64BitLoadCommand(MachOObj.get(), DRI)) { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); InMemoryStruct Sect; MachOObj->ReadSection64(LCI, DRI.d.b, Sect); - Result = parseSegmentOrSectionName(Sect->Name); + + strcpy(result, Sect->SegmentName); + strcat(result, ","); + strcat(result, Sect->Name); } else { LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a); InMemoryStruct Sect; MachOObj->ReadSection(LCI, DRI.d.b, Sect); - Result = parseSegmentOrSectionName(Sect->Name); - } - return object_error::success; -} -error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec, - StringRef &Res) const { - if (is64BitLoadCommand(MachOObj.get(), Sec)) { - LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a); - InMemoryStruct Sect; - MachOObj->ReadSection64(LCI, Sec.d.b, Sect); - Res = parseSegmentOrSectionName(Sect->SegmentName); - } else { - LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a); - InMemoryStruct Sect; - MachOObj->ReadSection(LCI, Sec.d.b, Sect); - Res = parseSegmentOrSectionName(Sect->SegmentName); + strcpy(result, Sect->SegmentName); + strcat(result, ","); + strcat(result, Sect->Name); } + Result = StringRef(result); return object_error::success; } diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index c324ff13a6b..3a350382ae1 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -334,15 +334,9 @@ void llvm::DisassembleInputMachO(StringRef Filename) { for (unsigned SectIdx = 0; SectIdx != Sections.size(); SectIdx++) { StringRef SectName; if (Sections[SectIdx].getName(SectName) || - SectName != "__text") + SectName.compare("__TEXT,__text")) continue; // Skip non-text sections - StringRef SegmentName; - DataRefImpl DR = Sections[SectIdx].getRawDataRefImpl(); - if (MachOOF->getSectionFinalSegmentName(DR, SegmentName) || - SegmentName != "__TEXT") - continue; - // Insert the functions from the function starts segment into our map. uint64_t VMAddr; Sections[SectIdx].getAddress(VMAddr); diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 9edcae8d6b3..2838a2a2b30 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -28,7 +28,6 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Object/Archive.h" #include "llvm/Object/COFF.h" -#include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" @@ -73,9 +72,9 @@ static cl::opt SymbolTable("t", cl::desc("Display the symbol table")); static cl::opt -MachOOpt("macho", cl::desc("Use MachO specific object file parser")); +MachO("macho", cl::desc("Use MachO specific object file parser")); static cl::alias -MachOm("m", cl::desc("Alias for --macho"), cl::aliasopt(MachOOpt)); +MachOm("m", cl::desc("Alias for --macho"), cl::aliasopt(MachO)); cl::opt llvm::TripleName("triple", cl::desc("Target triple to disassemble for, " @@ -568,13 +567,6 @@ static void PrintSymbolTable(const ObjectFile *o) { else if (Section == o->end_sections()) outs() << "*UND*"; else { - if (const MachOObjectFile *MachO = dyn_cast(o)) { - StringRef SegmentName; - DataRefImpl DR = Section->getRawDataRefImpl(); - if (error(MachO->getSectionFinalSegmentName(DR, SegmentName))) - SegmentName = ""; - outs() << SegmentName << ","; - } StringRef SectionName; if (error(Section->getName(SectionName))) SectionName = ""; @@ -648,7 +640,7 @@ static void DumpInput(StringRef file) { return; } - if (MachOOpt && Disassemble) { + if (MachO && Disassemble) { DisassembleInputMachO(file); return; }