[RuntimeDyld][MachO][AArch64] Add assertion to check for duplicate addend definition.
authorJuergen Ributzka <juergen@apple.com>
Tue, 22 Jul 2014 21:42:49 +0000 (21:42 +0000)
committerJuergen Ributzka <juergen@apple.com>
Tue, 22 Jul 2014 21:42:49 +0000 (21:42 +0000)
In MachO for AArch64 it is possible to have an explicit addend defined by
the ARM64_RELOC_ADDEND relocation or having an addend encoded within the
instruction. Only one of them are allowed per relocation.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213687 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/RuntimeDyld/Targets/RuntimeDyldMachOAArch64.h

index 775ed9ec363596e81d359a904a84bdc4d8faa430..d961606f0a32e2142191d637786397594fe560d8 100644 (file)
@@ -41,16 +41,14 @@ public:
     // addend for the following relocation. If found: (1) store the associated
     // addend, (2) consume the next relocation, and (3) use the stored addend to
     // override the addend.
-    bool HasExplicitAddend = false;
     int64_t ExplicitAddend = 0;
     if (Obj.getAnyRelocationType(RelInfo) == MachO::ARM64_RELOC_ADDEND) {
       assert(!Obj.getPlainRelocationExternal(RelInfo));
       assert(!Obj.getAnyRelocationPCRel(RelInfo));
       assert(Obj.getAnyRelocationLength(RelInfo) == 2);
-      HasExplicitAddend = true;
       int64_t RawAddend = Obj.getPlainRelocationSymbolNum(RelInfo);
       // Sign-extend the 24-bit to 64-bit.
-      ExplicitAddend = (RawAddend << 40) >> 40;
+      ExplicitAddend = SignExtend64(RawAddend, 24);
       ++RelI;
       RelInfo = Obj.getRelocation(RelI->getRawDataRefImpl());
     }
@@ -59,7 +57,9 @@ public:
     RelocationValueRef Value(
         getRelocationValueRef(ObjImg, RelI, RE, ObjSectionToID, Symbols));
 
-    if (HasExplicitAddend) {
+    assert((ExplicitAddend == 0 || RE.Addend == 0) && "Relocation has "\
+      "ARM64_RELOC_ADDEND and embedded addend in the instruction.");
+    if (ExplicitAddend) {
       RE.Addend = ExplicitAddend;
       Value.Addend = ExplicitAddend;
     }