[llvm] r178875 - Don't fetch pointers from a InMemoryStruct.

Rafael Espindola rafael.espindola at gmail.com
Fri Apr 5 08:15:22 PDT 2013


Author: rafael
Date: Fri Apr  5 10:15:22 2013
New Revision: 178875

URL: http://llvm.org/viewvc/llvm-project?rev=178875&view=rev
Log:
Don't fetch pointers from a InMemoryStruct.

InMemoryStruct is extremely dangerous as it returns data from an internal
buffer when the endiannes doesn't match. This should fix the tests on big
endian hosts.

Modified:
    llvm/trunk/include/llvm/Object/MachO.h
    llvm/trunk/lib/Object/MachOObjectFile.cpp
    llvm/trunk/test/tools/llvm-readobj/sections-ext.test
    llvm/trunk/test/tools/llvm-readobj/sections.test
    llvm/trunk/tools/llvm-objdump/MachODump.cpp
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
    llvm/trunk/tools/llvm-readobj/MachODumper.cpp

Modified: llvm/trunk/include/llvm/Object/MachO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachO.h?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/MachO.h (original)
+++ llvm/trunk/include/llvm/Object/MachO.h Fri Apr  5 10:15:22 2013
@@ -15,6 +15,7 @@
 #ifndef LLVM_OBJECT_MACHO_H
 #define LLVM_OBJECT_MACHO_H
 
+#include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Object/MachOObject.h"
 #include "llvm/Object/ObjectFile.h"
@@ -47,7 +48,12 @@ public:
   // 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;
+  StringRef getSectionFinalSegmentName(DataRefImpl Sec) const;
+
+  // Names are stored as 16 bytes. These returns the raw 16 bytes without
+  // interpreting them as a C string.
+  ArrayRef<char> getSectionRawName(DataRefImpl Sec) const;
+  ArrayRef<char>getSectionRawFinalSegmentName(DataRefImpl Sec) const;
 
   MachOObject *getObject() { return MachOObj.get(); }
 

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Fri Apr  5 10:15:22 2013
@@ -481,8 +481,7 @@ static StringRef parseSegmentOrSectionNa
   return StringRef(P, 16);
 }
 
-error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
-                                           StringRef &Result) const {
+ArrayRef<char> MachOObjectFile::getSectionRawName(DataRefImpl DRI) const {
   if (is64BitLoadCommand(MachOObj.get(), DRI)) {
     LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
     unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) +
@@ -490,7 +489,7 @@ error_code MachOObjectFile::getSectionNa
     StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64));
     const macho::Section64 *sec =
       reinterpret_cast<const macho::Section64*>(Data.data());
-    Result = parseSegmentOrSectionName(sec->Name);
+    return ArrayRef<char>(sec->Name, 16);
   } else {
     LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
     unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) +
@@ -498,13 +497,19 @@ error_code MachOObjectFile::getSectionNa
     StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section));
     const macho::Section *sec =
       reinterpret_cast<const macho::Section*>(Data.data());
-    Result = parseSegmentOrSectionName(sec->Name);
+    return ArrayRef<char>(sec->Name, 16);
   }
+}
+
+error_code MachOObjectFile::getSectionName(DataRefImpl DRI,
+                                           StringRef &Result) const {
+  ArrayRef<char> Raw = getSectionRawName(DRI);
+  Result = parseSegmentOrSectionName(Raw.data());
   return object_error::success;
 }
 
-error_code MachOObjectFile::getSectionFinalSegmentName(DataRefImpl Sec,
-                                                       StringRef &Res) const {
+ArrayRef<char>
+MachOObjectFile::getSectionRawFinalSegmentName(DataRefImpl Sec) const {
   if (is64BitLoadCommand(MachOObj.get(), Sec)) {
     LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
     unsigned SectionOffset = LCI.Offset + sizeof(macho::Segment64LoadCommand) +
@@ -512,7 +517,7 @@ error_code MachOObjectFile::getSectionFi
     StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section64));
     const macho::Section64 *sec =
       reinterpret_cast<const macho::Section64*>(Data.data());
-    Res = parseSegmentOrSectionName(sec->SegmentName);
+    return ArrayRef<char>(sec->SegmentName, 16);
   } else {
     LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(Sec.d.a);
     unsigned SectionOffset = LCI.Offset + sizeof(macho::SegmentLoadCommand) +
@@ -520,9 +525,13 @@ error_code MachOObjectFile::getSectionFi
     StringRef Data = MachOObj->getData(SectionOffset, sizeof(macho::Section));
     const macho::Section *sec =
       reinterpret_cast<const macho::Section*>(Data.data());
-    Res = parseSegmentOrSectionName(sec->SegmentName);
+    return ArrayRef<char>(sec->SegmentName);
   }
-  return object_error::success;
+}
+
+StringRef MachOObjectFile::getSectionFinalSegmentName(DataRefImpl DRI) const {
+  ArrayRef<char> Raw = getSectionRawFinalSegmentName(DRI);
+  return parseSegmentOrSectionName(Raw.data());
 }
 
 error_code MachOObjectFile::getSectionAddress(DataRefImpl DRI,

Modified: llvm/trunk/test/tools/llvm-readobj/sections-ext.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/sections-ext.test?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/sections-ext.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/sections-ext.test Fri Apr  5 10:15:22 2013
@@ -135,8 +135,8 @@ ELF-NEXT:   }
 MACHO:      Sections [
 MACHO-NEXT:   Section {
 MACHO-NEXT:     Index: 0
-MACHO-NEXT:     Name: __text (5F 5F 74 65 78 74 00
-MACHO-NEXT:     Segment:
+MACHO-NEXT:     Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
+MACHO-NEXT:     Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
 MACHO-NEXT:     Address: 0x0
 MACHO-NEXT:     Size: 0x22
 MACHO-NEXT:     Offset: 324

Modified: llvm/trunk/test/tools/llvm-readobj/sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-readobj/sections.test?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-readobj/sections.test (original)
+++ llvm/trunk/test/tools/llvm-readobj/sections.test Fri Apr  5 10:15:22 2013
@@ -79,8 +79,8 @@ ELF-NEXT:   }
 MACHO:      Sections [
 MACHO-NEXT:   Section {
 MACHO-NEXT:     Index: 0
-MACHO-NEXT:     Name: __text (
-MACHO-NEXT:     Segment: 
+MACHO-NEXT:     Name: __text (5F 5F 74 65 78 74 00 00 00 00 00 00 00 00 00 00)
+MACHO-NEXT:     Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
 MACHO-NEXT:     Address: 0x0
 MACHO-NEXT:     Size: 0x22
 MACHO-NEXT:     Offset: 324
@@ -97,8 +97,8 @@ MACHO-NEXT:     Reserved2: 0x0
 MACHO-NEXT:   }
 MACHO-NEXT:   Section {
 MACHO-NEXT:     Index: 1
-MACHO-NEXT:     Name: __cstring (
-MACHO-NEXT:     Segment:
+MACHO-NEXT:     Name: __cstring (5F 5F 63 73 74 72 69 6E 67 00 00 00 00 00 00 00)
+MACHO-NEXT:     Segment: __TEXT (5F 5F 54 45 58 54 00 00 00 00 00 00 00 00 00 00)
 MACHO-NEXT:     Address: 0x22
 MACHO-NEXT:     Size: 0xD
 MACHO-NEXT:     Offset: 358

Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Fri Apr  5 10:15:22 2013
@@ -337,10 +337,9 @@ void llvm::DisassembleInputMachO(StringR
         SectName != "__text")
       continue; // Skip non-text sections
 
-    StringRef SegmentName;
     DataRefImpl DR = Sections[SectIdx].getRawDataRefImpl();
-    if (MachOOF->getSectionFinalSegmentName(DR, SegmentName) ||
-        SegmentName != "__TEXT")
+    StringRef SegmentName = MachOOF->getSectionFinalSegmentName(DR);
+    if (SegmentName != "__TEXT")
       continue;
 
     // Insert the functions from the function starts segment into our map.

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Fri Apr  5 10:15:22 2013
@@ -257,8 +257,7 @@ static void DisassembleObject(const Obje
     StringRef SegmentName = "";
     if (const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(Obj)) {
       DataRefImpl DR = i->getRawDataRefImpl();
-      if (error(MachO->getSectionFinalSegmentName(DR, SegmentName)))
-        break;
+      SegmentName = MachO->getSectionFinalSegmentName(DR);
     }
     StringRef name;
     if (error(i->getName(name))) break;
@@ -593,10 +592,8 @@ static void PrintSymbolTable(const Objec
         outs() << "*UND*";
       else {
         if (const MachOObjectFile *MachO = dyn_cast<const MachOObjectFile>(o)) {
-          StringRef SegmentName;
           DataRefImpl DR = Section->getRawDataRefImpl();
-          if (error(MachO->getSectionFinalSegmentName(DR, SegmentName)))
-            SegmentName = "";
+          StringRef SegmentName = MachO->getSectionFinalSegmentName(DR);
           outs() << SegmentName << ",";
         }
         StringRef SectionName;

Modified: llvm/trunk/tools/llvm-readobj/MachODumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/MachODumper.cpp?rev=178875&r1=178874&r2=178875&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/MachODumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/MachODumper.cpp Fri Apr  5 10:15:22 2013
@@ -157,14 +157,6 @@ namespace {
   };
 }
 
-static StringRef parseSegmentOrSectionName(ArrayRef<char> P) {
-  if (P[15] == 0)
-    // Null terminated.
-    return StringRef(P.data());
-  // Not null terminated, so this is a 16 char string.
-  return StringRef(P.data(), 16);
-}
-
 static bool is64BitLoadCommand(const MachOObject *MachOObj, DataRefImpl DRI) {
   LoadCommandInfo LCI = MachOObj->getLoadCommandInfo(DRI.d.a);
   if (LCI.Command.Type == macho::LCT_Segment64)
@@ -181,8 +173,6 @@ static void getSection(const MachOObject
     InMemoryStruct<macho::Section64> Sect;
     MachOObj->ReadSection64(LCI, DRI.d.b, Sect);
 
-    Section.Name        = ArrayRef<char>(Sect->Name);
-    Section.SegmentName = ArrayRef<char>(Sect->SegmentName);
     Section.Address     = Sect->Address;
     Section.Size        = Sect->Size;
     Section.Offset      = Sect->Offset;
@@ -196,8 +186,6 @@ static void getSection(const MachOObject
     InMemoryStruct<macho::Section> Sect;
     MachOObj->ReadSection(LCI, DRI.d.b, Sect);
 
-    Section.Name        = Sect->Name;
-    Section.SegmentName = Sect->SegmentName;
     Section.Address     = Sect->Address;
     Section.Size        = Sect->Size;
     Section.Offset      = Sect->Offset;
@@ -270,15 +258,20 @@ void MachODumper::printSections() {
 
     MachOSection Section;
     getSection(MachO, SecI->getRawDataRefImpl(), Section);
+    DataRefImpl DR = SecI->getRawDataRefImpl();
+
     StringRef Name;
     if (error(SecI->getName(Name)))
         Name = "";
 
+    ArrayRef<char> RawName = Obj->getSectionRawName(DR);
+    StringRef SegmentName = Obj->getSectionFinalSegmentName(DR);
+    ArrayRef<char> RawSegmentName = Obj->getSectionRawFinalSegmentName(DR);
+
     DictScope SectionD(W, "Section");
     W.printNumber("Index", SectionIndex);
-    W.printBinary("Name", Name, Section.Name);
-    W.printBinary("Segment", parseSegmentOrSectionName(Section.SegmentName),
-                    Section.SegmentName);
+    W.printBinary("Name", Name, RawName);
+    W.printBinary("Segment", SegmentName, RawSegmentName);
     W.printHex   ("Address", Section.Address);
     W.printHex   ("Size", Section.Size);
     W.printNumber("Offset", Section.Offset);





More information about the llvm-commits mailing list