[mips] [IAS] Warn when LA is used with a 64-bit symbol.
authorToma Tabacu <toma.tabacu@imgtec.com>
Thu, 14 May 2015 10:53:40 +0000 (10:53 +0000)
committerToma Tabacu <toma.tabacu@imgtec.com>
Thu, 14 May 2015 10:53:40 +0000 (10:53 +0000)
Reviewers: dsanders

Reviewed By: dsanders

Subscribers: llvm-commits

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

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

lib/Target/Mips/AsmParser/MipsAsmParser.cpp
test/MC/Mips/mips-expansions-bad.s
test/MC/Mips/mips-expansions.s

index b757b2448e7b7618e4376e6cab3ff78708a54f84..45169b70513ba5b96f45ff5eed7db311b831d976 100644 (file)
@@ -195,7 +195,8 @@ class MipsAsmParser : public MCTargetAsmParser {
                                   SmallVectorImpl<MCInst> &Instructions);
 
   void expandLoadAddressSym(const MCOperand &DstRegOp, const MCOperand &SymOp,
-                            SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions);
+                            bool Is32BitSym, SMLoc IDLoc,
+                            SmallVectorImpl<MCInst> &Instructions);
 
   void expandMemInst(MCInst &Inst, SMLoc IDLoc,
                      SmallVectorImpl<MCInst> &Instructions, bool isLoad,
@@ -1876,7 +1877,7 @@ MipsAsmParser::expandLoadAddressReg(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc,
   assert((ImmOp.isImm() || ImmOp.isExpr()) &&
          "expected immediate operand kind");
   if (!ImmOp.isImm()) {
-    expandLoadAddressSym(DstRegOp, ImmOp, IDLoc, Instructions);
+    expandLoadAddressSym(DstRegOp, ImmOp, Is32BitImm, IDLoc, Instructions);
     return false;
   }
   const MCOperand &SrcRegOp = Inst.getOperand(1);
@@ -1899,7 +1900,7 @@ MipsAsmParser::expandLoadAddressImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc,
   assert((ImmOp.isImm() || ImmOp.isExpr()) &&
          "expected immediate operand kind");
   if (!ImmOp.isImm()) {
-    expandLoadAddressSym(DstRegOp, ImmOp, IDLoc, Instructions);
+    expandLoadAddressSym(DstRegOp, ImmOp, Is32BitImm, IDLoc, Instructions);
     return false;
   }
 
@@ -1910,10 +1911,12 @@ MipsAsmParser::expandLoadAddressImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc,
   return false;
 }
 
-void
-MipsAsmParser::expandLoadAddressSym(const MCOperand &DstRegOp,
-                                    const MCOperand &SymOp, SMLoc IDLoc,
-                                    SmallVectorImpl<MCInst> &Instructions) {
+void MipsAsmParser::expandLoadAddressSym(
+    const MCOperand &DstRegOp, const MCOperand &SymOp, bool Is32BitSym,
+    SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) {
+  if (Is32BitSym && isABI_N64())
+    Warning(IDLoc, "instruction loads the 32-bit address of a 64-bit symbol");
+
   MCInst tmpInst;
   unsigned RegNo = DstRegOp.getReg();
   const MCSymbolRefExpr *Symbol = cast<MCSymbolRefExpr>(SymOp.getExpr());
@@ -1923,7 +1926,7 @@ MipsAsmParser::expandLoadAddressSym(const MCOperand &DstRegOp,
   const MCSymbolRefExpr *LoExpr =
       MCSymbolRefExpr::Create(Symbol->getSymbol().getName(),
                               MCSymbolRefExpr::VK_Mips_ABS_LO, getContext());
-  if (isGP64bit()) {
+  if (!Is32BitSym) {
     // If it's a 64-bit architecture, expand to:
     // la d,sym => lui  d,highest(sym)
     //             ori  d,d,higher(sym)
index 0e37a29f5fd8f6de76de2af18addf3da3ed616a1..6bbde263f5f8d56b083a9a954ea8aecffbd17167 100644 (file)
@@ -1,7 +1,9 @@
 # RUN: not llvm-mc %s -arch=mips -mcpu=mips32r2 2>%t1
 # RUN: FileCheck %s < %t1 --check-prefix=32-BIT
-# RUN: not llvm-mc %s -arch=mips64 -mcpu=mips64 2>&1 | \
-# RUN:   FileCheck %s --check-prefix=64-BIT
+# RUN: not llvm-mc %s -arch=mips64 -mcpu=mips64 -target-abi n32 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=64-BIT --check-prefix=N32-ONLY
+# RUN: not llvm-mc %s -arch=mips64 -mcpu=mips64 -target-abi n64 2>&1 | \
+# RUN:   FileCheck %s --check-prefix=64-BIT --check-prefix=N64-ONLY
 
   .text
   li $5, 0x100000000
   la $5, 0x100000000($6)
   # 32-BIT: :[[@LINE-1]]:3: error: instruction requires a 32-bit immediate
   # 64-BIT: :[[@LINE-2]]:3: error: instruction requires a 32-bit immediate
+  la $5, symbol
+  # N64-ONLY: :[[@LINE-1]]:3: warning: instruction loads the 32-bit address of a 64-bit symbol
+  # N32-ONLY-NOT: :[[@LINE-2]]:3: warning: instruction loads the 32-bit address of a 64-bit symbol
+  # 64-BIT: lui $5, %hi(symbol)
+  # 64-BIT: ori $5, $5, %lo(symbol)
   dli $5, 1
   # 32-BIT: :[[@LINE-1]]:3: error: instruction requires a 64-bit architecture
index ca7218d634b022d572988df6431e66bcd4c4b341..5340448df1ce3883d20c0d15b79267ab53bcf131 100644 (file)
                                      #   fixup A - offset: 0, value: symbol@ABS_HI, kind: fixup_Mips_HI16
 # CHECK: ori     $8, $8, %lo(symbol) # encoding: [A,A,0x08,0x35]
                                      #   fixup A - offset: 0, value: symbol@ABS_LO, kind: fixup_Mips_LO16
-# CHECK: .set    mips64
-# CHECK: lui     $8, %highest(symbol)    # encoding: [A,A,0x08,0x3c]
-                                         #   fixup A - offset: 0, value: symbol@HIGHEST, kind: fixup_Mips_HIGHEST
-# CHECK: ori     $8, $8, %higher(symbol) # encoding: [A,A,0x08,0x35]
-                                         #   fixup A - offset: 0, value: symbol@HIGHER, kind: fixup_Mips_HIGHER
-# CHECK: dsll    $8, $8, 16              # encoding: [0x38,0x44,0x08,0x00]
-# CHECK: ori     $8, $8, %hi(symbol)     # encoding: [A,A,0x08,0x35]
-                                         #   fixup A - offset: 0, value: symbol@ABS_HI, kind: fixup_Mips_HI16
-# CHECK: dsll    $8, $8, 16              # encoding: [0x38,0x44,0x08,0x00]
-# CHECK: ori     $8, $8, %lo(symbol)     # encoding: [A,A,0x08,0x35]
-                                         #   fixup A - offset: 0, value: symbol@ABS_LO, kind: fixup_Mips_LO16
-# CHECK: .set    mips32r2
 # CHECK: lui     $10, %hi(symbol)        # encoding: [A,A,0x0a,0x3c]
 # CHECK:                                 #   fixup A - offset: 0, value: symbol@ABS_HI, kind: fixup_Mips_HI16
 # CHECK: addu    $10, $10, $4            # encoding: [0x21,0x50,0x44,0x01]
@@ -79,9 +67,6 @@
     la $a0, 20($a1)
     la $7,65538($8)
     la $t0, symbol
-    .set mips64
-    la $t0, symbol
-    .set mips32r2
 
     .set noat
     lw  $t2, symbol($a0)