[llvm] r249311 - [mips] Changed the way symbols are handled in dla and la instructions to allow simple expressions.

Daniel Sanders via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 5 06:19:29 PDT 2015


Author: dsanders
Date: Mon Oct  5 08:19:29 2015
New Revision: 249311

URL: http://llvm.org/viewvc/llvm-project?rev=249311&view=rev
Log:
[mips] Changed the way symbols are handled in dla and la instructions to allow simple expressions.

Summary:
An instruction like "(d)la $5, symbol+8" previously would have crashed the
assembler as it contains an expression. This is now fixed.
A few tests cases have also been changed to reflect these changes, however
these should only be syntax changes. Some new test cases have also been
added.

Patch by Scott Egerton.

Reviewers: vkalintiris, dsanders

Subscribers: llvm-commits

Differential Revision: http://reviews.llvm.org/D12760

Modified:
    llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
    llvm/trunk/test/MC/Mips/macro-dla.s
    llvm/trunk/test/MC/Mips/macro-la.s
    llvm/trunk/test/MC/Mips/mips-expansions.s

Modified: llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp?rev=249311&r1=249310&r2=249311&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp (original)
+++ llvm/trunk/lib/Target/Mips/AsmParser/MipsAsmParser.cpp Mon Oct  5 08:19:29 2015
@@ -2341,14 +2341,11 @@ bool MipsAsmParser::loadAndAddSymbolAddr
     SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) {
   warnIfNoMacro(IDLoc);
 
-  // FIXME: The way we're handling symbols right now prevents simple expressions
-  //        like foo+8. We'll be able to fix this once our unary operators (%hi
-  //        and similar) are treated as operators rather than as fixup types.
-  const MCSymbolRefExpr *Symbol = cast<MCSymbolRefExpr>(SymExpr);
-  const MCSymbolRefExpr *HiExpr = MCSymbolRefExpr::create(
-      &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_ABS_HI, getContext());
-  const MCSymbolRefExpr *LoExpr = MCSymbolRefExpr::create(
-      &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_ABS_LO, getContext());
+  const MCExpr *Symbol = cast<MCExpr>(SymExpr);
+  const MipsMCExpr *HiExpr = MipsMCExpr::create(
+      MCSymbolRefExpr::VK_Mips_ABS_HI, Symbol, getContext());
+  const MipsMCExpr *LoExpr = MipsMCExpr::create(
+      MCSymbolRefExpr::VK_Mips_ABS_LO, Symbol, getContext());
 
   bool UseSrcReg = SrcReg != Mips::NoRegister;
 
@@ -2360,10 +2357,10 @@ bool MipsAsmParser::loadAndAddSymbolAddr
     if (!ATReg)
       return true;
 
-    const MCSymbolRefExpr *HighestExpr = MCSymbolRefExpr::create(
-        &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_HIGHEST, getContext());
-    const MCSymbolRefExpr *HigherExpr = MCSymbolRefExpr::create(
-        &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_HIGHER, getContext());
+    const MipsMCExpr *HighestExpr = MipsMCExpr::create(
+        MCSymbolRefExpr::VK_Mips_HIGHEST, Symbol, getContext());
+    const MipsMCExpr *HigherExpr = MipsMCExpr::create(
+        MCSymbolRefExpr::VK_Mips_HIGHER, Symbol, getContext());
 
     if (UseSrcReg && (DstReg == SrcReg)) {
       // If $rs is the same as $rd:

Modified: llvm/trunk/test/MC/Mips/macro-dla.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/macro-dla.s?rev=249311&r1=249310&r2=249311&view=diff
==============================================================================
--- llvm/trunk/test/MC/Mips/macro-dla.s (original)
+++ llvm/trunk/test/MC/Mips/macro-dla.s Mon Oct  5 08:19:29 2015
@@ -634,51 +634,74 @@ symbol:           # CHECK-LABEL: symbol:
 .extern extern_sym
 .option pic0
 dla $5, extern_sym     # CHECK: lui $5, %highest(extern_sym)       # encoding: [0x3c,0x05,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHEST, kind: fixup_Mips_HIGHEST
+                       # CHECK:                                    # fixup A - offset: 0, value: %highest(extern_sym), kind: fixup_Mips_HIGHEST
                        # CHECK: lui $1, %hi(extern_sym)            # encoding: [0x3c,0x01,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_HI, kind: fixup_Mips_HI16
+                       # CHECK:                                    # fixup A - offset: 0, value: %hi(extern_sym), kind: fixup_Mips_HI16
                        # CHECK: daddiu $5, $5, %higher(extern_sym) # encoding: [0x64,0xa5,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHER, kind: fixup_Mips_HIGHER
+                       # CHECK:                                    # fixup A - offset: 0, value: %higher(extern_sym), kind: fixup_Mips_HIGHER
                        # CHECK: daddiu $1, $1, %lo(extern_sym)     # encoding: [0x64,0x21,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_LO, kind: fixup_Mips_LO16
+                       # CHECK:                                    # fixup A - offset: 0, value: %lo(extern_sym), kind: fixup_Mips_LO16
                        # CHECK: dsll32  $5, $5, 0                  # encoding: [0x00,0x05,0x28,0x3c]
                        # CHECK: daddu   $5, $5, $1                 # encoding: [0x00,0xa1,0x28,0x2d]
- 
-# FIXME: Simple symbol expressions crash the assembler.
-#dla $5, extern_sym+8   # TODO: lui $5, %highest(extern_sym)       # encoding: [0x3c,0x05,A,A]
-                       # TODO:                                    # fixup A - offset: 0, value: extern_sym at HIGHEST, kind: fixup_Mips_HIGHEST
-                       # TODO: lui $1, %hi(extern_sym)            # encoding: [0x3c,0x01,A,A]
-                       # TODO:                                    # fixup A - offset: 0, value: extern_sym at ABS_HI, kind: fixup_Mips_HI16
-                       # TODO: daddiu $5, $5, %higher(extern_sym) # encoding: [0x64,0xa5,A,A]
-                       # TODO:                                    # fixup A - offset: 0, value: extern_sym at HIGHER, kind: fixup_Mips_HIGHER
-                       # TODO: daddiu $1, $1, %lo(extern_sym)     # encoding: [0x64,0x21,A,A]
-                       # TODO:                                    # fixup A - offset: 0, value: extern_sym at ABS_LO, kind: fixup_Mips_LO16
-                       # TODO: dsll32  $5, $5, 0                  # encoding: [0x00,0x05,0x28,0x3c]
-                       # TODO: daddu   $5, $5, $1                 # encoding: [0x00,0xa1,0x28,0x2d]
 
 dla $5, extern_sym($8) # CHECK: lui $5, %highest(extern_sym)       # encoding: [0x3c,0x05,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHEST, kind: fixup_Mips_HIGHEST
+                       # CHECK:                                    # fixup A - offset: 0, value: %highest(extern_sym), kind: fixup_Mips_HIGHEST
                        # CHECK: lui $1, %hi(extern_sym)            # encoding: [0x3c,0x01,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_HI, kind: fixup_Mips_HI16
+                       # CHECK:                                    # fixup A - offset: 0, value: %hi(extern_sym), kind: fixup_Mips_HI16
                        # CHECK: daddiu $5, $5, %higher(extern_sym) # encoding: [0x64,0xa5,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHER, kind: fixup_Mips_HIGHER
+                       # CHECK:                                    # fixup A - offset: 0, value: %higher(extern_sym), kind: fixup_Mips_HIGHER
                        # CHECK: daddiu $1, $1, %lo(extern_sym)     # encoding: [0x64,0x21,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_LO, kind: fixup_Mips_LO16
+                       # CHECK:                                    # fixup A - offset: 0, value: %lo(extern_sym), kind: fixup_Mips_LO16
                        # CHECK: dsll32  $5, $5, 0                  # encoding: [0x00,0x05,0x28,0x3c]
                        # CHECK: daddu   $5, $5, $1                 # encoding: [0x00,0xa1,0x28,0x2d]
                        # CHECK: daddu   $5, $5, $8                 # encoding: [0x00,0xa8,0x28,0x2d]
 
 dla $5, extern_sym($5) # CHECK: lui $1, %highest(extern_sym)       # encoding: [0x3c,0x01,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHEST, kind: fixup_Mips_HIGHEST
+                       # CHECK:                                    # fixup A - offset: 0, value: %highest(extern_sym), kind: fixup_Mips_HIGHEST
                        # CHECK: daddiu $1, $1, %higher(extern_sym) # encoding: [0x64,0x21,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at HIGHER, kind: fixup_Mips_HIGHER
+                       # CHECK:                                    # fixup A - offset: 0, value: %higher(extern_sym), kind: fixup_Mips_HIGHER
                        # CHECK: dsll $1, $1, 16                    # encoding: [0x00,0x01,0x0c,0x38]
                        # CHECK: daddiu $1, $1, %hi(extern_sym)     # encoding: [0x64,0x21,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_HI, kind: fixup_Mips_HI16
+                       # CHECK:                                    # fixup A - offset: 0, value: %hi(extern_sym), kind: fixup_Mips_HI16
                        # CHECK: dsll $1, $1, 16                    # encoding: [0x00,0x01,0x0c,0x38]
                        # CHECK: daddiu $1, $1, %lo(extern_sym)     # encoding: [0x64,0x21,A,A]
-                       # CHECK:                                    # fixup A - offset: 0, value: extern_sym at ABS_LO, kind: fixup_Mips_LO16
+                       # CHECK:                                    # fixup A - offset: 0, value: %lo(extern_sym), kind: fixup_Mips_LO16
                        # CHECK: daddu   $5, $1, $5                 # encoding: [0x00,0x25,0x28,0x2d]
 
+dla $5, extern_sym+8     # CHECK: lui $5, %highest(extern_sym+8)       # encoding: [0x3c,0x05,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %highest(extern_sym+8), kind: fixup_Mips_HIGHEST
+                         # CHECK: lui $1, %hi(extern_sym+8)            # encoding: [0x3c,0x01,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %hi(extern_sym+8), kind: fixup_Mips_HI16
+                         # CHECK: daddiu $5, $5, %higher(extern_sym+8) # encoding: [0x64,0xa5,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %higher(extern_sym+8), kind: fixup_Mips_HIGHER
+                         # CHECK: daddiu $1, $1, %lo(extern_sym+8)     # encoding: [0x64,0x21,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %lo(extern_sym+8), kind: fixup_Mips_LO16
+                         # CHECK: dsll32  $5, $5, 0                    # encoding: [0x00,0x05,0x28,0x3c]
+                         # CHECK: daddu   $5, $5, $1                   # encoding: [0x00,0xa1,0x28,0x2d]
+
+dla $5, extern_sym+8($8) # CHECK: lui $5, %highest(extern_sym+8)       # encoding: [0x3c,0x05,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %highest(extern_sym+8), kind: fixup_Mips_HIGHEST
+                         # CHECK: lui $1, %hi(extern_sym+8)            # encoding: [0x3c,0x01,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %hi(extern_sym+8), kind: fixup_Mips_HI16
+                         # CHECK: daddiu $5, $5, %higher(extern_sym+8) # encoding: [0x64,0xa5,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %higher(extern_sym+8), kind: fixup_Mips_HIGHER
+                         # CHECK: daddiu $1, $1, %lo(extern_sym+8)     # encoding: [0x64,0x21,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %lo(extern_sym+8), kind: fixup_Mips_LO16
+                         # CHECK: dsll32  $5, $5, 0                    # encoding: [0x00,0x05,0x28,0x3c]
+                         # CHECK: daddu   $5, $5, $1                   # encoding: [0x00,0xa1,0x28,0x2d]
+                         # CHECK: daddu   $5, $5, $8                   # encoding: [0x00,0xa8,0x28,0x2d]
+
+dla $5, extern_sym+8($5) # CHECK: lui $1, %highest(extern_sym+8)       # encoding: [0x3c,0x01,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %highest(extern_sym+8), kind: fixup_Mips_HIGHEST
+                         # CHECK: daddiu $1, $1, %higher(extern_sym+8) # encoding: [0x64,0x21,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %higher(extern_sym+8), kind: fixup_Mips_HIGHER
+                         # CHECK: dsll $1, $1, 16                      # encoding: [0x00,0x01,0x0c,0x38]
+                         # CHECK: daddiu $1, $1, %hi(extern_sym+8)     # encoding: [0x64,0x21,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %hi(extern_sym+8), kind: fixup_Mips_HI16
+                         # CHECK: dsll $1, $1, 16                      # encoding: [0x00,0x01,0x0c,0x38]
+                         # CHECK: daddiu $1, $1, %lo(extern_sym+8)     # encoding: [0x64,0x21,A,A]
+                         # CHECK:                                      # fixup A - offset: 0, value: %lo(extern_sym+8), kind: fixup_Mips_LO16
+                         # CHECK: daddu   $5, $1, $5                   # encoding: [0x00,0x25,0x28,0x2d]
+
 .option pic2
 #dla $5, symbol

Modified: llvm/trunk/test/MC/Mips/macro-la.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/macro-la.s?rev=249311&r1=249310&r2=249311&view=diff
==============================================================================
--- llvm/trunk/test/MC/Mips/macro-la.s (original)
+++ llvm/trunk/test/MC/Mips/macro-la.s Mon Oct  5 08:19:29 2015
@@ -245,21 +245,35 @@ la $6, 0x80008000($6) # CHECK: lui $1, 3
                       # CHECK: addu $6, $1, $6   # encoding: [0x00,0x26,0x30,0x21]
 
 la $5, symbol         # CHECK: lui $5, %hi(symbol)       # encoding: [0x3c,0x05,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_HI, kind: fixup_Mips_HI16
+                      # CHECK:                           #   fixup A - offset: 0, value: %hi(symbol), kind: fixup_Mips_HI16
                       # CHECK: addiu $5, $5, %lo(symbol) # encoding: [0x24,0xa5,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_LO, kind: fixup_Mips_LO16
+                      # CHECK:                           #   fixup A - offset: 0, value: %lo(symbol), kind: fixup_Mips_LO16
 la $5, symbol($6)     # CHECK: lui $5, %hi(symbol)       # encoding: [0x3c,0x05,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_HI, kind: fixup_Mips_HI16
+                      # CHECK:                           #   fixup A - offset: 0, value: %hi(symbol), kind: fixup_Mips_HI16
                       # CHECK: addiu $5, $5, %lo(symbol) # encoding: [0x24,0xa5,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_LO, kind: fixup_Mips_LO16
+                      # CHECK:                           #   fixup A - offset: 0, value: %lo(symbol), kind: fixup_Mips_LO16
                       # CHECK: addu $5, $5, $6           # encoding: [0x00,0xa6,0x28,0x21]
 la $6, symbol($6)     # CHECK: lui $1, %hi(symbol)       # encoding: [0x3c,0x01,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_HI, kind: fixup_Mips_HI16
+                      # CHECK:                           #   fixup A - offset: 0, value: %hi(symbol), kind: fixup_Mips_HI16
                       # CHECK: addiu $1, $1, %lo(symbol) # encoding: [0x24,0x21,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: symbol at ABS_LO, kind: fixup_Mips_LO16
+                      # CHECK:                           #   fixup A - offset: 0, value: %lo(symbol), kind: fixup_Mips_LO16
                       # CHECK: addu $6, $1, $6           # encoding: [0x00,0x26,0x30,0x21]
-la $5, 1f             # CHECK: lui $5, %hi($tmp0)        # encoding: [0x3c,0x05,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: ($tmp0)@ABS_HI, kind: fixup_Mips_HI16
-                      # CHECK: addiu $5, $5, %lo($tmp0)  # encoding: [0x24,0xa5,A,A]
-                      # CHECK:                           #   fixup A - offset: 0, value: ($tmp0)@ABS_LO, kind: fixup_Mips_LO16
+la $5, symbol+8       # CHECK: lui $5, %hi(symbol+8)       # encoding: [0x3c,0x05,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %hi(symbol+8), kind: fixup_Mips_HI16
+                      # CHECK: addiu $5, $5, %lo(symbol+8) # encoding: [0x24,0xa5,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %lo(symbol+8), kind: fixup_Mips_LO16
+la $5, symbol+8($6)   # CHECK: lui $5, %hi(symbol+8)       # encoding: [0x3c,0x05,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %hi(symbol+8), kind: fixup_Mips_HI16
+                      # CHECK: addiu $5, $5, %lo(symbol+8) # encoding: [0x24,0xa5,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %lo(symbol+8), kind: fixup_Mips_LO16
+                      # CHECK: addu $5, $5, $6             # encoding: [0x00,0xa6,0x28,0x21]
+la $6, symbol+8($6)   # CHECK: lui $1, %hi(symbol+8)       # encoding: [0x3c,0x01,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %hi(symbol+8), kind: fixup_Mips_HI16
+                      # CHECK: addiu $1, $1, %lo(symbol+8) # encoding: [0x24,0x21,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %lo(symbol+8), kind: fixup_Mips_LO16
+                      # CHECK: addu $6, $1, $6             # encoding: [0x00,0x26,0x30,0x21]
+la $5, 1f             # CHECK: lui $5, %hi(($tmp0))        # encoding: [0x3c,0x05,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %hi(($tmp0)), kind: fixup_Mips_HI16
+                      # CHECK: addiu $5, $5, %lo(($tmp0))  # encoding: [0x24,0xa5,A,A]
+                      # CHECK:                             #   fixup A - offset: 0, value: %lo(($tmp0)), kind: fixup_Mips_LO16
 1:

Modified: llvm/trunk/test/MC/Mips/mips-expansions.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Mips/mips-expansions.s?rev=249311&r1=249310&r2=249311&view=diff
==============================================================================
--- llvm/trunk/test/MC/Mips/mips-expansions.s (original)
+++ llvm/trunk/test/MC/Mips/mips-expansions.s Mon Oct  5 08:19:29 2015
@@ -8,10 +8,10 @@
 # Load address, done by MipsAsmParser::expandLoadAddressReg()
 # and MipsAsmParser::expandLoadAddressImm():
   la $8, 1f
-# CHECK-LE: lui     $8, %hi($tmp0)      # encoding: [A,A,0x08,0x3c]
-# CHECK-LE:                             #   fixup A - offset: 0, value: ($tmp0)@ABS_HI, kind: fixup_Mips_HI16
-# CHECK-LE: addiu   $8, $8, %lo($tmp0)  # encoding: [A,A,0x08,0x25]
-# CHECK-LE:                             #   fixup A - offset: 0, value: ($tmp0)@ABS_LO, kind: fixup_Mips_LO16
+# CHECK-LE: lui     $8, %hi(($tmp0))      # encoding: [A,A,0x08,0x3c]
+# CHECK-LE:                             #   fixup A - offset: 0, value: %hi(($tmp0)), kind: fixup_Mips_HI16
+# CHECK-LE: addiu   $8, $8, %lo(($tmp0))  # encoding: [A,A,0x08,0x25]
+# CHECK-LE:                             #   fixup A - offset: 0, value: %lo(($tmp0)), kind: fixup_Mips_LO16
 
 # LW/SW and LDC1/SDC1 of symbol address, done by MipsAsmParser::expandMemInst():
   .set noat




More information about the llvm-commits mailing list