[llvm] r213548 - [mips] Do not emit '.module fp=...' unless we really need to.

Daniel Sanders daniel.sanders at imgtec.com
Mon Jul 21 08:25:24 PDT 2014


Author: dsanders
Date: Mon Jul 21 10:25:24 2014
New Revision: 213548

URL: http://llvm.org/viewvc/llvm-project?rev=213548&view=rev
Log:
[mips] Do not emit '.module fp=...' unless we really need to.

We now emit this value when we need to contradict the default value. This
restores support for binutils 2.24.

When a suitable binutils has been released we can resume unconditionally
emitting .module directives. This is preferable to omitting the .module
directives since the .module directives protect against, for example,
accidentally assembling FP32 code with -mfp64 and producing an unusuable object.


Modified:
    llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
    llvm/trunk/test/CodeGen/Mips/abiflags32.ll

Modified: llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp?rev=213548&r1=213547&r2=213548&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp Mon Jul 21 10:25:24 2014
@@ -708,16 +708,21 @@ void MipsAsmPrinter::EmitStartOfAsmFile(
   }
 
   getTargetStreamer().updateABIInfo(*Subtarget);
-  getTargetStreamer().emitDirectiveModuleFP();
 
-  // If we are targeting O32 then we must emit a '.module [no]oddspreg' ...
-  if (Subtarget->isABI_O32()) {
-    // ... but don't emit it unless we are contradicting the default or an
-    // option has changed the default (i.e. FPXX).
-    if (!Subtarget->useOddSPReg() || Subtarget->isABI_FPXX())
-      getTargetStreamer().emitDirectiveModuleOddSPReg(Subtarget->useOddSPReg(),
-                                                      Subtarget->isABI_O32());
-  }
+  // We should always emit a '.module fp=...' but binutils 2.24 does not accept
+  // it. We therefore emit it when it contradicts the ABI defaults (-mfpxx or
+  // -mfp64) and omit it otherwise.
+  if (Subtarget->isABI_O32() && (Subtarget->isABI_FPXX() ||
+                                 Subtarget->isFP64bit()))
+    getTargetStreamer().emitDirectiveModuleFP();
+
+  // We should always emit a '.module [no]oddspreg' but binutils 2.24 does not
+  // accept it. We therefore emit it when it contradicts the default or an
+  // option has changed the default (i.e. FPXX) and omit it otherwise.
+  if (Subtarget->isABI_O32() && (!Subtarget->useOddSPReg() ||
+                                 Subtarget->isABI_FPXX()))
+    getTargetStreamer().emitDirectiveModuleOddSPReg(Subtarget->useOddSPReg(),
+                                                    Subtarget->isABI_O32());
 }
 
 void MipsAsmPrinter::EmitJal(MCSymbol *Symbol) {

Modified: llvm/trunk/test/CodeGen/Mips/abiflags32.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/abiflags32.ll?rev=213548&r1=213547&r2=213548&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/Mips/abiflags32.ll (original)
+++ llvm/trunk/test/CodeGen/Mips/abiflags32.ll Mon Jul 21 10:25:24 2014
@@ -3,10 +3,15 @@
 ; RUN: llc -filetype=asm -mtriple mipsel-unknown-linux -mcpu=mips64 -mattr=-n64,n32 %s -o - | FileCheck  -check-prefix=CHECK-64n %s
 
 ; CHECK: .nan    legacy
-; CHECK: .module fp=32
+; We don't emit '.module fp=32' for compatibility with binutils 2.24 which
+; doesn't accept .module.
+; CHECK-NOT: .module fp=32
 
 ; CHECK-64: .nan    legacy
+; We do emit '.module fp=64' though since it contradicts the default value.
 ; CHECK-64: .module fp=64
 
 ; CHECK-64n: .nan    legacy
-; CHECK-64n: .module fp=64
+; We don't emit '.module fp=64' for compatibility with binutils 2.24 which
+; doesn't accept .module.
+; CHECK-64n-NOT: .module fp=64





More information about the llvm-commits mailing list