[PATCH] D81919: [MIPS64] Workaround fixup_Mips_32 for getExprOpValue

Leslie Zhai via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 16 18:06:04 PDT 2020


xiangzhai updated this revision to Diff 271252.
xiangzhai added a comment.

> How about?
> 
>       .text
>   main:
>       nop
>       daddiu $t9, $ra, main

I got the difference:

GNU toolchain:

  $ objdump -r t.gnu.o 
  
  t.gnu.o:     file format elf64-tradlittlemips
  
  RELOCATION RECORDS FOR [.text]:
  OFFSET           TYPE              VALUE 
  0000000000000008 R_MIPS_LO16       main
  0000000000000008 R_MIPS_NONE       *ABS*
  0000000000000008 R_MIPS_NONE       *ABS*
  0000000000000010 R_MIPS_32         main
  0000000000000010 R_MIPS_NONE       *ABS*
  0000000000000010 R_MIPS_NONE       *ABS*

But LLVM toolchain:

  $ objdump -r t.llvm.o 
  
  t.llvm.o:     file format elf64-tradlittlemips
  
  RELOCATION RECORDS FOR [.text]:
  OFFSET           TYPE              VALUE 
  0000000000000010 R_MIPS_32         main
  0000000000000010 R_MIPS_NONE       *ABS*
  0000000000000010 R_MIPS_NONE       *ABS*

Perhaps I need to investigate `AsmParser` :)


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D81919/new/

https://reviews.llvm.org/D81919

Files:
  llvm/include/llvm/MC/MCContext.h
  llvm/lib/MC/MCContext.cpp
  llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
  llvm/test/MC/Mips/reloc-directive-bad-n64.s


Index: llvm/test/MC/Mips/reloc-directive-bad-n64.s
===================================================================
--- /dev/null
+++ llvm/test/MC/Mips/reloc-directive-bad-n64.s
@@ -0,0 +1,10 @@
+# RUN: llvm-mc -triple mips64el-unknown-linux < %s -show-encoding \
+# RUN:     -target-abi=n64 2>&1 | FileCheck %s
+	.text
+       .global main
+main:
+       nop
+       daddiu $t9, $ra, main - .    # CHECK: :[[@LINE]]:25: warning: should use explicit constraints!
+       daddiu $t9, $ra, main
+       nop
+       .word main
Index: llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
===================================================================
--- llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
+++ llvm/lib/Target/Mips/MCTargetDesc/MipsMCCodeEmitter.cpp
@@ -722,6 +722,7 @@
   }
 
   if (Kind == MCExpr::SymbolRef) {
+    Ctx.reportWarning(Expr->getLoc(), "should use explicit constraints!");
     Mips::Fixups FixupKind = Mips::Fixups(0);
 
     switch(cast<MCSymbolRefExpr>(Expr)->getKind()) {
@@ -732,7 +733,10 @@
       break;
     } // switch
 
-    Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(FixupKind)));
+    if (!STI.getFeatureBits()[Mips::FeatureMips64])
+      Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(FixupKind)));
+    else
+      Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(Mips::fixup_MIPS_PCLO16)));
     return 0;
   }
   return 0;
Index: llvm/lib/MC/MCContext.cpp
===================================================================
--- llvm/lib/MC/MCContext.cpp
+++ llvm/lib/MC/MCContext.cpp
@@ -606,6 +606,19 @@
 }
 
 //===----------------------------------------------------------------------===//
+// Warning Reporting
+//===----------------------------------------------------------------------===//
+
+void MCContext::reportWarning(SMLoc Loc, const Twine &Msg) {
+  // If we have a source manager use it. Otherwise, try using the inline source
+  // manager.
+  if (SrcMgr)
+    SrcMgr->PrintMessage(Loc, SourceMgr::DK_Warning, Msg);
+  else if (InlineSrcMgr)
+    InlineSrcMgr->PrintMessage(Loc, SourceMgr::DK_Warning, Msg);
+}
+
+//===----------------------------------------------------------------------===//
 // Error Reporting
 //===----------------------------------------------------------------------===//
 
Index: llvm/include/llvm/MC/MCContext.h
===================================================================
--- llvm/include/llvm/MC/MCContext.h
+++ llvm/include/llvm/MC/MCContext.h
@@ -645,6 +645,8 @@
 
     void deallocate(void *Ptr) {}
 
+    void reportWarning(SMLoc L, const Twine &Msg);
+
     bool hadError() { return HadError; }
     void reportError(SMLoc L, const Twine &Msg);
     // Unrecoverable error has occurred. Display the best diagnostic we can


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81919.271252.patch
Type: text/x-patch
Size: 2762 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200617/c8e1d87e/attachment.bin>


More information about the llvm-commits mailing list