]> granicus.if.org Git - clang/commitdiff
[mips] Explain why we need to always clobber for MIPS inline asm. NFC.
authorToma Tabacu <toma.tabacu@imgtec.com>
Mon, 12 Jan 2015 14:41:30 +0000 (14:41 +0000)
committerToma Tabacu <toma.tabacu@imgtec.com>
Mon, 12 Jan 2015 14:41:30 +0000 (14:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225632 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp

index 17014873220480dae9171926f46a82da56a88979..dbb7fb7b3fb35f1a9616d10924b50447a5251b1b 100644 (file)
@@ -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}";
   }