[lld] r219843 - [mach-o] avoid overly clever std::find_if

Tim Northover tnorthover at apple.com
Wed Oct 15 13:26:24 PDT 2014


Author: tnorthover
Date: Wed Oct 15 15:26:24 2014
New Revision: 219843

URL: http://llvm.org/viewvc/llvm-project?rev=219843&view=rev
Log:
[mach-o] avoid overly clever std::find_if

The bots were complaining (possibly because of a lack of traits on the iterator
I was trying to use). No functional change.

Modified:
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp
    lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
    lld/trunk/test/mach-o/parse-eh-frame-x86-anon.yaml
    lld/trunk/test/mach-o/parse-eh-frame.yaml

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler.h Wed Oct 15 15:26:24 2014
@@ -74,6 +74,9 @@ public:
   /// actually be used.
   virtual uint32_t dwarfCompactUnwindType() = 0;
 
+  /// Reference from an __eh_frame FDE to the CIE it's based on.
+  virtual Reference::KindValue unwindRefToCIEKind() = 0;
+
   /// Reference from an __eh_frame FDE atom to the function it's
   /// describing. Usually pointer-sized and PC-relative, but differs in whether
   /// it needs to be in relocatable objects.

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm.cpp Wed Oct 15 15:26:24 2014
@@ -48,6 +48,10 @@ public:
     return invalid;
   }
 
+  Reference::KindValue unwindRefToCIEKind() override {
+    return invalid;
+  }
+
   Reference::KindValue unwindRefToFunctionKind() override {
     return invalid;
   }

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp Wed Oct 15 15:26:24 2014
@@ -91,6 +91,10 @@ public:
     return invalid;
   }
 
+  Reference::KindValue unwindRefToCIEKind() override {
+    return invalid;
+  }
+
   Reference::KindValue unwindRefToFunctionKind() override {
     return invalid;
   }

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86.cpp Wed Oct 15 15:26:24 2014
@@ -51,6 +51,10 @@ public:
     return invalid;
   }
 
+  Reference::KindValue unwindRefToCIEKind() override {
+    return negDelta32;
+  }
+
   Reference::KindValue unwindRefToFunctionKind() override{
     return delta32;
   }

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp Wed Oct 15 15:26:24 2014
@@ -84,6 +84,10 @@ public:
     return imageOffsetGot;
   }
 
+  Reference::KindValue unwindRefToCIEKind() override {
+    return negDelta32;
+  }
+
   Reference::KindValue unwindRefToFunctionKind() override{
     return unwindFDEToFunction;
   }
@@ -167,7 +171,8 @@ private:
     delta32,               /// ex: .long _foo - .
     delta64Anon,           /// ex: .quad L1 - .
     delta32Anon,           /// ex: .long L1 - .
-    
+    negDelta32,            /// ex: .long . - _foo
+
     // Kinds introduced by Passes:
     ripRel32GotLoadNowLea, /// Target of GOT load is in linkage unit so 
                            ///  "movq  _foo at GOTPCREL(%rip), %rax" can be changed
@@ -218,6 +223,7 @@ const Registry::KindStrings ArchHandler_
   LLD_KIND_STRING_ENTRY(pointer64), LLD_KIND_STRING_ENTRY(pointer64Anon),
   LLD_KIND_STRING_ENTRY(delta32), LLD_KIND_STRING_ENTRY(delta64),
   LLD_KIND_STRING_ENTRY(delta32Anon), LLD_KIND_STRING_ENTRY(delta64Anon),
+  LLD_KIND_STRING_ENTRY(negDelta32),
   LLD_KIND_STRING_ENTRY(imageOffset), LLD_KIND_STRING_ENTRY(imageOffsetGot),
   LLD_KIND_STRING_ENTRY(unwindFDEToFunction),
   LLD_KIND_STRING_ENTRY(unwindInfoToEhFrame),
@@ -507,6 +513,9 @@ void ArchHandler_x86_64::applyFixupFinal
     location[-2] = 0x8D;
     write32(*loc32, _swap, (targetAddress - (fixupAddress + 4)) + ref.addend());
     return;
+  case negDelta32:
+    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());
+    return;
   case lazyPointer:
   case lazyImmediateLocation:
     // do nothing
@@ -574,6 +583,9 @@ void ArchHandler_x86_64::applyFixupReloc
   case delta64Anon:
     write64(*loc64, _swap, (targetAddress - fixupAddress) + ref.addend());
     return;
+  case negDelta32:
+    write32(*loc32, _swap, fixupAddress - targetAddress + ref.addend());
+    return;
   case ripRel32GotLoadNowLea:
     llvm_unreachable("ripRel32GotLoadNowLea implies GOT pass was run");
     return;
@@ -675,6 +687,7 @@ void ArchHandler_x86_64::appendSectionRe
     return;
   case unwindFDEToFunction:
   case unwindInfoToEhFrame:
+  case negDelta32:
     return;
   case ripRel32GotLoadNowLea:
     llvm_unreachable("ripRel32GotLoadNowLea implies GOT pass was run");

Modified: lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/CompactUnwindPass.cpp Wed Oct 15 15:26:24 2014
@@ -415,17 +415,14 @@ private:
           ArchHandler::isDwarfCIE(_swap, ehFrameAtom))
         continue;
 
-      auto functionRef = std::find_if(ehFrameAtom->begin(), ehFrameAtom->end(),
-                                      [&](const Reference *ref) {
-        return ref->kindNamespace() == Reference::KindNamespace::mach_o &&
-               ref->kindArch() == _archHandler.kindArch() &&
-               ref->kindValue() == _archHandler.unwindRefToFunctionKind();
-      });
-
-      if (functionRef != ehFrameAtom->end()) {
-        const Atom *functionAtom = functionRef->target();
-        dwarfFrames.insert(std::make_pair(functionAtom, ehFrameAtom));
-      }
+      DefinedAtom::reference_iterator ref = ehFrameAtom->begin();
+      for (; ref != ehFrameAtom->end(); ++ref)
+        if (ref->kindNamespace() == Reference::KindNamespace::mach_o &&
+            ref->kindArch() == _archHandler.kindArch() &&
+            ref->kindValue() == _archHandler.unwindRefToFunctionKind()) {
+          dwarfFrames.insert(std::make_pair(ref->target(), ehFrameAtom));
+          break;
+        }
     }
   }
 

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp Wed Oct 15 15:26:24 2014
@@ -660,15 +660,30 @@ std::error_code addEHFrameReferences(con
 
     const uint8_t *frameData = atom->rawContent().data();
     uint32_t size = read32(swap, *(uint32_t *)frameData);
-    uint64_t rangeFieldInFDE = size == 0xffffffffU
-                                   ? 2 * sizeof(uint32_t) + sizeof(uint64_t)
-                                   : 2 * sizeof(uint32_t);
+    uint64_t cieFieldInFDE = size == 0xffffffffU
+                                   ? sizeof(uint32_t) + sizeof(uint64_t)
+                                   : sizeof(uint32_t);
+
+    // Linker needs to fixup a reference from the FDE to its parent CIE (a
+    // 32-bit byte offset backwards in the __eh_frame section).
+    uint32_t cieDelta = read32(swap, *(uint32_t *)(frameData + cieFieldInFDE));
+    uint64_t cieAddress = ehFrameSection->address + offset + cieFieldInFDE;
+    cieAddress -= cieDelta;
+
+    Reference::Addend addend;
+    const Atom *cie =
+        findAtomCoveringAddress(normalizedFile, file, cieAddress, &addend);
+    atom->addReference(cieFieldInFDE, handler.unwindRefToCIEKind(), cie,
+                       addend, handler.kindArch());
+
+    // Linker needs to fixup reference from the FDE to the function it's
+    // describing.
+    uint64_t rangeFieldInFDE = cieFieldInFDE + sizeof(uint32_t);
 
     int64_t functionFromFDE = readSPtr(is64, swap, frameData + rangeFieldInFDE);
     uint64_t rangeStart = ehFrameSection->address + offset + rangeFieldInFDE;
     rangeStart += functionFromFDE;
 
-    Reference::Addend addend;
     const Atom *func =
         findAtomCoveringAddress(normalizedFile, file, rangeStart, &addend);
     atom->addReference(rangeFieldInFDE, handler.unwindRefToFunctionKind(), func,

Modified: lld/trunk/test/mach-o/parse-eh-frame-x86-anon.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/parse-eh-frame-x86-anon.yaml?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/test/mach-o/parse-eh-frame-x86-anon.yaml (original)
+++ lld/trunk/test/mach-o/parse-eh-frame-x86-anon.yaml Wed Oct 15 15:26:24 2014
@@ -105,24 +105,24 @@ undefined-symbols:
 ...
 
 # CHECK: defined-atoms:   
-# FIXME:   - ref-name:        [[CIE:L[L0-9]+]]
+# CHECK:   - ref-name:        [[CIE:L[L0-9]+]]
 # CHECK:     type:            unwind-cfi
 # CHECK:     content:          
 # CHECK:   - type:            unwind-cfi
 # CHECK:     content:         
 # CHECK:     references:
-# FIXME:       - kind:            negDelta32
-# FIXME:         offset:          4
-# FIXME:         target:          [[CIE]]
+# CHECK:       - kind:            negDelta32
+# CHECK:         offset:          4
+# CHECK:         target:          [[CIE]]
 # CHECK:       - kind:            delta32
 # CHECK:         offset:          8
 # CHECK:         target:          __Z3foov
 # CHECK:   - type:            unwind-cfi
 # CHECK:     content:          
 # CHECK:     references:
-# FIXME:       - kind:            negDelta32
-# FIXME:         offset:          4
-# FIXME:         target:          [[CIE]]
+# CHECK:       - kind:            negDelta32
+# CHECK:         offset:          4
+# CHECK:         target:          [[CIE]]
 # CHECK:       - kind:            delta32
 # CHECK:         offset:          8
 # CHECK:         target:          __Z3barv

Modified: lld/trunk/test/mach-o/parse-eh-frame.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/parse-eh-frame.yaml?rev=219843&r1=219842&r2=219843&view=diff
==============================================================================
--- lld/trunk/test/mach-o/parse-eh-frame.yaml (original)
+++ lld/trunk/test/mach-o/parse-eh-frame.yaml Wed Oct 15 15:26:24 2014
@@ -51,7 +51,8 @@ global-symbols:
 ...
 
 # CHECK: defined-atoms:
-# CHECK:   - type:            unwind-cfi
+# CHECK:   - ref-name:        [[CIE:L[0-9]+]]
+# CHECK:     type:            unwind-cfi
 # CHECK:     content:         [ 14, 00, 00, 00, 00, 00, 00, 00, 01, 7A, 52, 00,
 # CHECK:                        01, 78, 10, 01, 10, 0C, 07, 08, 90, 01, 00, 00 ]
 # CHECK:   - type:            unwind-cfi
@@ -60,6 +61,9 @@ global-symbols:
 # CHECK:                        00, 41, 0E, 10, 86, 02, 43, 0D, 06, 00, 00, 00,
 # CHECK:                        00, 00, 00, 00 ]
 # CHECK:     references:
+# CHECK:       - kind:            negDelta32
+# CHECK:         offset:          4
+# CHECK:         target:          [[CIE]]
 # CHECK:       - kind:            unwindFDEToFunction
 # CHECK:         offset:          8
 # CHECK:         target:          __Z3barv
@@ -69,6 +73,9 @@ global-symbols:
 # CHECK:                        00, 41, 0E, 10, 86, 02, 43, 0D, 06, 00, 00, 00,
 # CHECK:                        00, 00, 00, 00 ]
 # CHECK:     references:
+# CHECK:       - kind:            negDelta32
+# CHECK:         offset:          4
+# CHECK:         target:          [[CIE]]
 # CHECK:       - kind:            unwindFDEToFunction
 # CHECK:         offset:          8
 # CHECK:         target:          __Z3foov





More information about the llvm-commits mailing list