MC: Simplify MayNeedRelaxation to not provide the fixups, so we can query it
authorDaniel Dunbar <daniel@zuster.org>
Wed, 26 May 2010 17:45:29 +0000 (17:45 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 26 May 2010 17:45:29 +0000 (17:45 +0000)
before encoding.

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

include/llvm/Target/TargetAsmBackend.h
lib/MC/MCAssembler.cpp
lib/MC/MCMachOStreamer.cpp
lib/Target/X86/X86AsmBackend.cpp

index 527c9e1ea1db4135ca29fc5e84705e2cf942550f..7a1689d0873655e2f7bd0a2dc7ab7ff9577dddd4 100644 (file)
@@ -112,10 +112,7 @@ public:
   /// relaxation.
   ///
   /// \arg Inst - The instruction to test.
-  /// \arg Fixups - The actual fixups this instruction encoded to, for potential
-  /// use by the target backend.
-  virtual bool MayNeedRelaxation(const MCInst &Inst,
-                           const SmallVectorImpl<MCFixup> &Fixups) const = 0;
+  virtual bool MayNeedRelaxation(const MCInst &Inst) const = 0;
 
   /// RelaxInstruction - Relax the instruction in the given fragment to the next
   /// wider instruction.
index 705521d9d7aed55c42e732ba39da7e13cdc87d85..703f727d9d7dcfc02410c27d875703eebee592a7 100644 (file)
@@ -787,7 +787,7 @@ bool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF,
   // If this inst doesn't ever need relaxation, ignore it. This occurs when we
   // are intentionally pushing out inst fragments, or because we relaxed a
   // previous instruction to one that doesn't need relaxation.
-  if (!getBackend().MayNeedRelaxation(IF->getInst(), IF->getFixups()))
+  if (!getBackend().MayNeedRelaxation(IF->getInst()))
     return false;
 
   for (MCInstFragment::const_fixup_iterator it = IF->fixup_begin(),
index f49acf28b97914b4d8f8c81da2da5983a82b8ee6..50348e4ea3ea85c421885e5146de04812878b6b1 100644 (file)
@@ -452,7 +452,7 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
   // total knowledge about undefined symbols at that point). Even now, though,
   // we can do a decent job, especially on Darwin where scattering means that we
   // are going to often know that we can never fully resolve a fixup.
-  if (Assembler.getBackend().MayNeedRelaxation(Inst, AsmFixups)) {
+  if (Assembler.getBackend().MayNeedRelaxation(Inst)) {
     MCInstFragment *IF = new MCInstFragment(Inst, CurSectionData);
     IF->setAtom(CurrentAtomMap.lookup(CurSectionData));
 
index aaa5845d66e872098e80788151633528fb01bb53..c647713428a4553d21f8a13635ad27dbdd152224 100644 (file)
@@ -54,8 +54,7 @@ public:
       DF.getContents()[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8));
   }
 
-  bool MayNeedRelaxation(const MCInst &Inst,
-                         const SmallVectorImpl<MCFixup> &Fixups) const;
+  bool MayNeedRelaxation(const MCInst &Inst) const;
 
   void RelaxInstruction(const MCInstFragment *IF, MCInst &Res) const;
 
@@ -88,31 +87,16 @@ static unsigned getRelaxedOpcode(unsigned Op) {
   }
 }
 
-bool X86AsmBackend::MayNeedRelaxation(const MCInst &Inst,
-                              const SmallVectorImpl<MCFixup> &Fixups) const {
-  for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
-    const MCFixup &F = Fixups[i];
+bool X86AsmBackend::MayNeedRelaxation(const MCInst &Inst) const {
+  // Check if this instruction is ever relaxable.
+  if (getRelaxedOpcode(Inst.getOpcode()) == Inst.getOpcode())
+    return false;
 
-    // We don't support relaxing anything else currently. Make sure we error out
-    // if we see a non-constant 1 or 2 byte fixup.
-    //
-    // FIXME: We should need to check this here, this is better checked in the
-    // object writer which should be verifying that any final relocations match
-    // the expected fixup. However, that code is more complicated and hasn't
-    // been written yet. See the FIXMEs in MachObjectWriter.cpp.
-    if ((F.getKind() == FK_Data_1 || F.getKind() == FK_Data_2) &&
-        !isa<MCConstantExpr>(F.getValue()))
-      report_fatal_error("unexpected small fixup with a non-constant operand!");
-
-    // Check for a 1byte pcrel fixup, and enforce that we would know how to
-    // relax this instruction.
-    if (unsigned(F.getKind()) == X86::reloc_pcrel_1byte) {
-      assert(getRelaxedOpcode(Inst.getOpcode()) != Inst.getOpcode());
-      return true;
-    }
-  }
-
-  return false;
+  // If so, just assume it can be relaxed. Once we support relaxing more complex
+  // instructions we should check that the instruction actually has symbolic
+  // operands before doing this, but we need to be careful about things like
+  // PCrel.
+  return true;
 }
 
 // FIXME: Can tblgen help at all here to verify there aren't other instructions