Thumb's forced-PC-alignment requirement applies to the _total_ displacement, not...
authorOwen Anderson <resistor@mac.com>
Fri, 17 Dec 2010 21:49:48 +0000 (21:49 +0000)
committerOwen Anderson <resistor@mac.com>
Fri, 17 Dec 2010 21:49:48 +0000 (21:49 +0000)
portion.  While the fragment boundary is usually already aligned, it is possible for it not to be, which
would lead to a non-aligned final displacement.

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

lib/MC/MCAssembler.cpp

index 0a9783d885d7eb05241998f5e411491d57b92406..2d89fb3ed9965984f3997f7f7191045b9f01b4b9 100644 (file)
@@ -254,12 +254,12 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout,
     "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!");
 
   if (IsPCRel) {
-    uint32_t Offset = Fixup.getOffset();
+    uint32_t Offset = Layout.getFragmentOffset(DF) + Fixup.getOffset();
     
     // A number of ARM fixups in Thumb mode require that the effective PC
     // address be determined as the 32-bit aligned version of the actual offset.
     if (ShouldAlignPC) Offset &= ~0x3;
-    Value -= Layout.getFragmentOffset(DF) + Offset;
+    Value -= Offset;
   }
 
   // ARM fixups based from a thumb function address need to have the low