[mach-o] don't assume all sections have symbols
authorTim Northover <tnorthover@apple.com>
Wed, 25 Jun 2014 10:59:37 +0000 (10:59 +0000)
committerTim Northover <tnorthover@apple.com>
Wed, 25 Jun 2014 10:59:37 +0000 (10:59 +0000)
We were trying to examine the first symbol in a section that we wanted to
atomize by symbols, even when there wasn't one. Instead, we should make the
initial anonymous symbol cover the entire section in that situation.

llvm-svn: 211681

lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
lld/test/mach-o/parse-section-no-symbol.yaml [new file with mode: 0644]

index 2be8d3b..7de85e8 100644 (file)
@@ -284,11 +284,13 @@ std::error_code processSymboledSection(DefinedAtom::ContentType atomType,
   if (symbols.empty() && section.content.empty())
     return std::error_code();
 
-  const uint64_t firstSymbolAddr = symbols.front()->value;
-  if (firstSymbolAddr != section.address) {
+  uint64_t anonAtomEnd = symbols.empty()
+                             ? section.address + section.content.size()
+                             : (uint64_t)symbols.front()->value;
+  if (anonAtomEnd != section.address) {
     // Section has anonymous content before first symbol.
-    atomFromSymbol(atomType, section, file, section.address, StringRef(),
-                  0, Atom::scopeTranslationUnit, firstSymbolAddr, copyRefs);
+    atomFromSymbol(atomType, section, file, section.address, StringRef(), 0,
+                   Atom::scopeTranslationUnit, anonAtomEnd, copyRefs);
   }
 
   const Symbol *lastSym = nullptr;
diff --git a/lld/test/mach-o/parse-section-no-symbol.yaml b/lld/test/mach-o/parse-section-no-symbol.yaml
new file mode 100644 (file)
index 0000000..46d005a
--- /dev/null
@@ -0,0 +1,23 @@
+# RUN: lld -flavor darwin -arch x86_64 -r %s -print_atoms -o %t2 | FileCheck %s
+#
+# Test parsing of mach-o functions with no symbols at all.
+#
+
+--- !mach-o
+arch:            x86_64
+file-type:       MH_OBJECT
+flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID:        false
+OS:              unknown
+sections:
+  - segment:         __TEXT
+    section:         __text
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+    alignment:       4
+    address:         0x0000000000000000
+    content:         [ 0xCC ]
+...
+
+# CHECK-NOT:  name:
+# CHECK:      content:         [ CC ]