authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-10 13:25:20-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-09-10 13:25:20-04:00
loge92d74958c49e99953ddd5e2b92d0539a224174d
treee736c6631bdf56787fb8262ee5783c77cbe26881
parent016a59e3a155894412ccf3d98fe6ac1054243d06
signature Commit is signed but in an unrecognized format.

lld: apply patch: [mach-o] Extend LC_DATA_IN_CODE support to x86_64

This applies 91864f82c7d7bd1a151fdfd076a3a67a2893b868 from LLVM trunk to the embedded LLD. Once Zig upgrades to LLD 10, there will be no difference between Zig's fork and upstream, and Zig's fork can be dropped.

1 files changed, 42 insertions(+), 8 deletions(-)

deps/lld/lib/ReaderWriter/MachO/ArchHandler_x86_64.cpp+42-8
......@@ -181,6 +181,20 @@ public:
181181 FindAddressForAtom addressForAtom,
182182 normalized::Relocations &relocs) override;
183183
184 bool isDataInCodeTransition(Reference::KindValue refKind) override {
185 return refKind == modeCode || refKind == modeData;
186 }
187
188 Reference::KindValue dataInCodeTransitionStart(
189 const MachODefinedAtom &atom) override {
190 return modeData;
191 }
192
193 Reference::KindValue dataInCodeTransitionEnd(
194 const MachODefinedAtom &atom) override {
195 return modeCode;
196 }
197
184198private:
185199 static const Registry::KindStrings _sKindStrings[];
186200 static const StubInfo _sStubInfo;
......@@ -188,6 +202,9 @@ private:
188202 enum X86_64Kind: Reference::KindValue {
189203 invalid, /// for error condition
190204
205 modeCode, /// Content starting at this offset is code.
206 modeData, /// Content starting at this offset is data.
207
191208 // Kinds found in mach-o .o files:
192209 branch32, /// ex: call _foo
193210 ripRel32, /// ex: movq _foo(%rip), %rax
......@@ -242,24 +259,34 @@ private:
242259};
243260
244261const Registry::KindStrings ArchHandler_x86_64::_sKindStrings[] = {
245 LLD_KIND_STRING_ENTRY(invalid), LLD_KIND_STRING_ENTRY(branch32),
246 LLD_KIND_STRING_ENTRY(ripRel32), LLD_KIND_STRING_ENTRY(ripRel32Minus1),
247 LLD_KIND_STRING_ENTRY(ripRel32Minus2), LLD_KIND_STRING_ENTRY(ripRel32Minus4),
262 LLD_KIND_STRING_ENTRY(invalid),
263 LLD_KIND_STRING_ENTRY(modeCode),
264 LLD_KIND_STRING_ENTRY(modeData),
265 LLD_KIND_STRING_ENTRY(branch32),
266 LLD_KIND_STRING_ENTRY(ripRel32),
267 LLD_KIND_STRING_ENTRY(ripRel32Minus1),
268 LLD_KIND_STRING_ENTRY(ripRel32Minus2),
269 LLD_KIND_STRING_ENTRY(ripRel32Minus4),
248270 LLD_KIND_STRING_ENTRY(ripRel32Anon),
249271 LLD_KIND_STRING_ENTRY(ripRel32Minus1Anon),
250272 LLD_KIND_STRING_ENTRY(ripRel32Minus2Anon),
251273 LLD_KIND_STRING_ENTRY(ripRel32Minus4Anon),
252274 LLD_KIND_STRING_ENTRY(ripRel32GotLoad),
253275 LLD_KIND_STRING_ENTRY(ripRel32GotLoadNowLea),
254 LLD_KIND_STRING_ENTRY(ripRel32Got), LLD_KIND_STRING_ENTRY(ripRel32Tlv),
276 LLD_KIND_STRING_ENTRY(ripRel32Got),
277 LLD_KIND_STRING_ENTRY(ripRel32Tlv),
255278 LLD_KIND_STRING_ENTRY(lazyPointer),
256279 LLD_KIND_STRING_ENTRY(lazyImmediateLocation),
257 LLD_KIND_STRING_ENTRY(pointer64), LLD_KIND_STRING_ENTRY(pointer64Anon),
258 LLD_KIND_STRING_ENTRY(delta32), LLD_KIND_STRING_ENTRY(delta64),
259 LLD_KIND_STRING_ENTRY(delta32Anon), LLD_KIND_STRING_ENTRY(delta64Anon),
280 LLD_KIND_STRING_ENTRY(pointer64),
281 LLD_KIND_STRING_ENTRY(pointer64Anon),
282 LLD_KIND_STRING_ENTRY(delta32),
283 LLD_KIND_STRING_ENTRY(delta64),
284 LLD_KIND_STRING_ENTRY(delta32Anon),
285 LLD_KIND_STRING_ENTRY(delta64Anon),
260286 LLD_KIND_STRING_ENTRY(negDelta64),
261287 LLD_KIND_STRING_ENTRY(negDelta32),
262 LLD_KIND_STRING_ENTRY(imageOffset), LLD_KIND_STRING_ENTRY(imageOffsetGot),
288 LLD_KIND_STRING_ENTRY(imageOffset),
289 LLD_KIND_STRING_ENTRY(imageOffsetGot),
263290 LLD_KIND_STRING_ENTRY(unwindFDEToFunction),
264291 LLD_KIND_STRING_ENTRY(unwindInfoToEhFrame),
265292 LLD_KIND_STRING_ENTRY(tlvInitSectionOffset),
......@@ -601,6 +628,8 @@ void ArchHandler_x86_64::applyFixupFinal(
601628 case negDelta32:
602629 *loc32 = fixupAddress - targetAddress + ref.addend();
603630 return;
631 case modeCode:
632 case modeData:
604633 case lazyPointer:
605634 // Do nothing
606635 return;
......@@ -720,6 +749,8 @@ void ArchHandler_x86_64::applyFixupRelocatable(const Reference &ref,
720749 case unwindInfoToEhFrame:
721750 llvm_unreachable("fixup implies __unwind_info");
722751 return;
752 case modeCode:
753 case modeData:
723754 case unwindFDEToFunction:
724755 // Do nothing for now
725756 return;
......@@ -743,6 +774,9 @@ void ArchHandler_x86_64::appendSectionRelocations(
743774 assert(ref.kindArch() == Reference::KindArch::x86_64);
744775 uint32_t sectionOffset = atomSectionOffset + ref.offsetInAtom();
745776 switch (static_cast<X86_64Kind>(ref.kindValue())) {
777 case modeCode:
778 case modeData:
779 return;
746780 case branch32:
747781 appendReloc(relocs, sectionOffset, symbolIndexForAtom(*ref.target()), 0,
748782 X86_64_RELOC_BRANCH | rPcRel | rExtern | rLength4);