Try harder to evaluate expressions when printing assembly.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 12 Mar 2014 16:55:59 +0000 (16:55 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 12 Mar 2014 16:55:59 +0000 (16:55 +0000)
When printing assembly we don't have a Layout object, but we can still
try to fold some constants.

Testcase by Ulrich Weigand.

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

include/llvm/MC/MCExpr.h
lib/MC/MCAssembler.cpp
lib/MC/MCExpr.cpp
lib/MC/MachObjectWriter.cpp
lib/Target/AArch64/MCTargetDesc/AArch64MCExpr.cpp
lib/Target/Mips/MCTargetDesc/MipsMCExpr.cpp
lib/Target/PowerPC/MCTargetDesc/PPCMCExpr.cpp
lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp
test/MC/PowerPC/ppc64-fixups.s

index 133bd5280d7cb9def0e081f84c32ea0b22adc56c..a822513ffd899e73ce88ac10c3651b4dd73d9dcd 100644 (file)
@@ -91,7 +91,7 @@ public:
   /// @param Res - The relocatable value, if evaluation succeeds.
   /// @param Layout - The assembler layout object to use for evaluating values.
   /// @result - True on success.
-  bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout &Layout) const;
+  bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout) const;
 
   /// FindAssociatedSection - Find the "associated section" for this expression,
   /// which is currently defined as the absolute section for constants, or
index b8a4b438f6ccd3b6a1a9600e49a5a3d93f01508e..89d7d1901675208f1f0ba7e3c3080a78ccbdf143 100644 (file)
@@ -122,7 +122,7 @@ uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const {
   // If this is a variable, then recursively evaluate now.
   if (S.isVariable()) {
     MCValue Target;
-    if (!S.getVariableValue()->EvaluateAsRelocatable(Target, *this))
+    if (!S.getVariableValue()->EvaluateAsRelocatable(Target, this))
       report_fatal_error("unable to evaluate offset for variable '" +
                          S.getName() + "'");
 
@@ -357,7 +357,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,
                                 MCValue &Target, uint64_t &Value) const {
   ++stats::evaluateFixup;
 
-  if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout))
+  if (!Fixup.getValue()->EvaluateAsRelocatable(Target, &Layout))
     getContext().FatalError(Fixup.getLoc(), "expected relocatable expression");
 
   bool IsPCRel = Backend.getFixupKindInfo(
index 75bde8ed36be4be3736132628bdf3f16acc406ac..9a4c41699e104a4e57440fd3cd301c47d87c1364 100644 (file)
@@ -607,9 +607,9 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm,
 }
 
 bool MCExpr::EvaluateAsRelocatable(MCValue &Res,
-                                   const MCAsmLayout &Layout) const {
-  return EvaluateAsRelocatableImpl(Res, &Layout.getAssembler(), &Layout,
-                                   0, false);
+                                   const MCAsmLayout *Layout) const {
+  MCAssembler *Assembler = Layout ? &Layout->getAssembler() : 0;
+  return EvaluateAsRelocatableImpl(Res, Assembler, Layout, 0, false);
 }
 
 bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
index edbd2b98b28c46f71dcd76cb7bcf08230ca571fa..b3b593d3154be1bfa30fedaa38d0bf5c578f4b35 100644 (file)
@@ -82,7 +82,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD,
 
 
     MCValue Target;
-    if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout))
+    if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout))
       report_fatal_error("unable to evaluate offset for variable '" +
                          S.getName() + "'");
 
@@ -631,7 +631,7 @@ void MachObjectWriter::markAbsoluteVariableSymbols(MCAssembler &Asm,
     // and neither symbol is external, mark the variable as absolute.
     const MCExpr *Expr = SD.getSymbol().getVariableValue();
     MCValue Value;
-    if (Expr->EvaluateAsRelocatable(Value, Layout)) {
+    if (Expr->EvaluateAsRelocatable(Value, &Layout)) {
       if (Value.getSymA() && Value.getSymB())
         const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute();
     }
index 66ce92d7b93b0c9e75e964b20d46252fca348cdb..c7ccaee865337ac5150ac3918a2efe9eca29355d 100644 (file)
@@ -79,7 +79,7 @@ void AArch64MCExpr::PrintImpl(raw_ostream &OS) const {
 bool
 AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
                                          const MCAsmLayout *Layout) const {
-  return getSubExpr()->EvaluateAsRelocatable(Res, *Layout);
+  return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
 }
 
 static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
index e470fea16530333406b371c2728fe8f9fd976e7e..22ce41100a0f9b7d24e0fb87afb49f727c33b658 100644 (file)
@@ -36,9 +36,7 @@ void MipsMCExpr::PrintImpl(raw_ostream &OS) const {
 bool
 MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
                                       const MCAsmLayout *Layout) const {
-  if (!Layout)
-    return false;
-  return getSubExpr()->EvaluateAsRelocatable(Res, *Layout);
+  return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
 }
 
 // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps
index 562badfd59dd2793463878c1629fb09813f3816b..c181e03fe6419b13b13cb79ea0f81a81643aed81 100644 (file)
@@ -54,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
                                      const MCAsmLayout *Layout) const {
   MCValue Value;
 
-  if (!Layout || !getSubExpr()->EvaluateAsRelocatable(Value, *Layout))
+  if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout))
     return false;
 
   if (Value.isAbsolute()) {
@@ -86,6 +86,9 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
     }
     Res = MCValue::get(Result);
   } else {
+    if (!Layout)
+      return false;
+
     MCContext &Context = Layout->getAssembler().getContext();
     const MCSymbolRefExpr *Sym = Value.getSymA();
     MCSymbolRefExpr::VariantKind Modifier = Sym->getKind();
index 7f2b25e408146702f8d39f216d68ad69ca41212e..e6b2acab9d03cd3be50ab9fbc621d240ee530183 100644 (file)
@@ -160,9 +160,7 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) {
 bool
 SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res,
                                        const MCAsmLayout *Layout) const {
-  if (!Layout)
-    return false;
-  return getSubExpr()->EvaluateAsRelocatable(Res, *Layout);
+  return getSubExpr()->EvaluateAsRelocatable(Res, Layout);
 }
 
 static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) {
index a0750664c2c7a0c859a8ae21c5aaa27f4ec9df37..733e3b9be7ba99767e757dea3bf3c4e242f1ebcb 100644 (file)
@@ -423,6 +423,14 @@ base:
 # CHECK-REL:                             0x{{[0-9A-F]*[048C]}} R_PPC64_TLS target 0x0
          add 3, 4, target@tls
 
+# Verify that fixups on constants are resolved at assemble time
+
+# CHECK: ori 1, 2, 65535              # encoding: [0x60,0x41,0xff,0xff]
+         ori 1, 2, 131071@l
+# CHECK: ori 1, 2, 1                  # encoding: [0x60,0x41,0x00,0x01]
+         ori 1, 2, 131071@h
+# CHECK: ori 1, 2, 2                  # encoding: [0x60,0x41,0x00,0x02]
+         ori 1, 2, 131071@ha
 
 # Data relocs
 # llvm-mc does not show any "encoding" string for data, so we just check the relocs
@@ -442,7 +450,3 @@ base:
 # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0
        .quad target@dtprel
 
-# Constant fixup
-        ori 1, 2, 131071@l
-# CHECK: ori 1, 2, 131071@l              # encoding: [0x60,0x41,A,A]
-# CHECK-NEXT:                            #   fixup A - offset: 2, value: 131071@l, kind: fixup_ppc_half16