Move some ARM specific MCAssmebler bits into the ARMAsmBackend.
authorJim Grosbach <grosbach@apple.com>
Wed, 18 Jan 2012 00:23:57 +0000 (00:23 +0000)
committerJim Grosbach <grosbach@apple.com>
Wed, 18 Jan 2012 00:23:57 +0000 (00:23 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148364 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAsmBackend.h
lib/MC/MCAssembler.cpp
lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp

index b841ddb9f5ab499d432fa0785f45fb7fa558fefc..285e07c0d6250306e676a5b5f0e831d090e99531 100644 (file)
 
 namespace llvm {
 class MCAsmLayout;
+class MCAssembler;
 class MCELFObjectTargetWriter;
 class MCFixup;
+class MCFragment;
 class MCInst;
 class MCInstFragment;
 class MCObjectWriter;
 class MCSection;
+class MCValue;
 template<typename T>
 class SmallVectorImpl;
 class raw_ostream;
@@ -87,6 +90,13 @@ public:
   /// getFixupKindInfo - Get information on a fixup kind.
   virtual const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;
 
+  /// processFixupValue - Target hook to adjust the literal value of a fixup
+  /// if necessary. The default does nothing.
+  virtual void processFixupValue(const MCAssembler &Asm,
+                                 const MCAsmLayout &Layout,
+                                 const MCFixup &Fixup, const MCFragment *DF,
+                                 MCValue &Target, uint64_t &Value) {}
+
   /// @}
 
   /// ApplyFixup - Apply the \arg Value for given \arg Fixup into the provided
index 1cb97ce61fcc3316584aa6a79d94581d5d4a24e7..e3cfae84ee0a74f41d4141f5ea4df03001562759 100644 (file)
@@ -273,13 +273,10 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
 
   Value = Target.getConstant();
 
-  bool IsThumb = false;
   if (const MCSymbolRefExpr *A = Target.getSymA()) {
     const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
     if (Sym.isDefined())
       Value += Layout.getSymbolOffset(&getSymbolData(Sym));
-    if (isThumbFunc(&Sym))
-      IsThumb = true;
   }
   if (const MCSymbolRefExpr *B = Target.getSymB()) {
     const MCSymbol &Sym = B->getSymbol().AliasedSymbol();
@@ -302,12 +299,8 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
     Value -= Offset;
   }
 
-  // ARM fixups based from a thumb function address need to have the low
-  // bit set. The actual value is always at least 16-bit aligned, so the
-  // low bit is normally clear and available for use as an ISA flag for
-  // interworking.
-  if (IsThumb)
-    Value |= 1;
+  // Let the backend adjust the fixup value if necessary.
+  Backend.processFixupValue(*this, Layout, Fixup, DF, Target, Value);
 
   return IsResolved;
 }
index 7b3f966ea82ae81ccad0e6574f9d6ff1f4b991b1..88fea5745d8739bccadb46d68a53e7a34da856f3 100644 (file)
@@ -22,6 +22,7 @@
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCSubtargetInfo.h"
+#include "llvm/MC/MCValue.h"
 #include "llvm/Object/MachOFormat.h"
 #include "llvm/Support/ELF.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -101,6 +102,20 @@ public:
     return Infos[Kind - FirstTargetFixupKind];
   }
 
+  /// processFixupValue - Target hook to process the literal value of a fixup
+  /// if necessary.
+  void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout,
+                         const MCFixup &Fixup, const MCFragment *DF,
+                         MCValue &Target, uint64_t &Value) {
+    // Some fixups to thumb function symbols need the low bit (thumb bit)
+    // twiddled.
+    if (const MCSymbolRefExpr *A = Target.getSymA()) {
+      const MCSymbol &Sym = A->getSymbol().AliasedSymbol();
+      if (Asm.isThumbFunc(&Sym))
+        Value |= 1;
+    }
+  }
+
   bool MayNeedRelaxation(const MCInst &Inst) const;
 
   bool fixupNeedsRelaxation(const MCFixup &Fixup,