From 47dbd429daefa9b3f19347194ddfb6f69642465e Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Wed, 15 Dec 2010 18:48:27 +0000 Subject: Implement cleanups suggested by Daniel. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121875 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCAssembler.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'lib/MC/MCAssembler.cpp') diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 0fbd77c7f1..0d114fb731 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -248,14 +248,18 @@ bool MCAssembler::EvaluateFixup(const MCObjectWriter &Writer, if (IsResolved) IsResolved = Writer.IsFixupFullyResolved(*this, Target, IsPCRel, DF); + bool ShouldAlignPC = Emitter.getFixupKindInfo(Fixup.getKind()).Flags & + MCFixupKindInfo::FKF_IsAlignedDownTo32Bits; + assert((ShouldAlignPC ? IsPCRel : true) && + "FKF_IsAlignedDownTo32Bits is only allowed on PC-relative fixups!"); + if (IsPCRel) { - bool ShouldAlignPC = Emitter.getFixupKindInfo( - Fixup.getKind()).Flags & MCFixupKindInfo::FKF_IsAligned; - // PC should be aligned to a 4-byte value. - if (ShouldAlignPC) - Value -= Layout.getFragmentOffset(DF) + (Fixup.getOffset() & ~0x3); - else - Value -= Layout.getFragmentOffset(DF) + Fixup.getOffset(); + uint32_t Offset = 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; } // ARM fixups based from a thumb function address need to have the low -- cgit v1.2.3