[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