r225632 - [mips] Explain why we need to always clobber for MIPS inline asm. NFC.

Toma Tabacu toma.tabacu at imgtec.com
Mon Jan 12 06:41:31 PST 2015


Author: tomatabacu
Date: Mon Jan 12 08:41:30 2015
New Revision: 225632

URL: http://llvm.org/viewvc/llvm-project?rev=225632&view=rev
Log:
[mips] Explain why we need to always clobber  for MIPS inline asm. NFC.

Modified:
    cfe/trunk/lib/Basic/Targets.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=225632&r1=225631&r2=225632&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Mon Jan 12 08:41:30 2015
@@ -5802,6 +5802,27 @@ public:
   }
 
   const char *getClobbers() const override {
+    // In GCC, $1 is not widely used in generated code (it's used only in a few
+    // specific situations), so there is no real need for users to add it to
+    // the clobbers list if they want to use it in their inline assembly code.
+    //
+    // In LLVM, $1 is treated as a normal GPR and is always allocatable during
+    // code generation, so using it in inline assembly without adding it to the
+    // clobbers list can cause conflicts between the inline assembly code and
+    // the surrounding generated code.
+    //
+    // Another problem is that LLVM is allowed to choose $1 for inline assembly
+    // operands, which will conflict with the ".set at" assembler option (which
+    // we use only for inline assembly, in order to maintain compatibility with
+    // GCC) and will also conflict with the user's usage of $1.
+    //
+    // The easiest way to avoid these conflicts and keep $1 as an allocatable
+    // register for generated code is to automatically clobber $1 for all inline
+    // assembly code.
+    //
+    // FIXME: We should automatically clobber $1 only for inline assembly code
+    // which actually uses it. This would allow LLVM to use $1 for inline
+    // assembly operands if the user's assembly code doesn't use it.
     return "~{$1}";
   }
 





More information about the cfe-commits mailing list