]> granicus.if.org Git - clang/commitdiff
Expand %= into ${:uid} so that the code generator emits a unique ID for the
authorChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 05:39:21 +0000 (05:39 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 10 Mar 2009 05:39:21 +0000 (05:39 +0000)
asm.  This allows us to properly handle the case when an optimizer duplicates
the asm, such as here:

void bar() {
  int i;
  for (i = 0; i < 3; ++i)
    asm("foo %=" : : "r"(0));
}

we now produce:

_bar:
xorl %eax, %eax
## InlineAsm Start
foo 0
## InlineAsm End
## InlineAsm Start
foo 1
## InlineAsm End
## InlineAsm Start
foo 2
## InlineAsm End
ret

instead of:

_bar:
xorl %eax, %eax
## InlineAsm Start
foo 1
## InlineAsm End
## InlineAsm Start
foo 1
## InlineAsm End
## InlineAsm Start
foo 1
## InlineAsm End
ret

This also fixes a fixme by eliminating a static.

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

lib/CodeGen/CGStmt.cpp

index 3fd652677715504307832d613ea2e41d57bcc22c..5989dcc06803787bfed6e1f2499ecd8283ce3241 100644 (file)
@@ -714,10 +714,6 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
   
   unsigned NumOperands = S.getNumOutputs() + S.getNumInputs();
   
-  // FIXME: Static counters are not thread safe or reproducible.
-  static unsigned AsmCounter = 0;
-  AsmCounter++;
-  
   while (*Start) {
     switch (*Start) {
     default:
@@ -729,10 +725,8 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
     case '%':
       // Escaped character
       Start++;
-      if (!*Start) {
-        // FIXME: This should be caught during Sema.
-        assert(0 && "Trailing '%' in asm string.");
-      }
+      // FIXME: This should be caught during Sema.
+      assert(*Start && "Trailing '%' in asm string.");
       
       char EscapedChar = *Start;
       if (EscapedChar == '%') {
@@ -740,7 +734,7 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
         Result += '%';
       } else if (EscapedChar == '=') {
         // Generate an unique ID.
-        Result += llvm::utostr(AsmCounter);
+        Result += "${:uid}";
       } else if (isdigit(EscapedChar)) {
         // %n - Assembler operand n
         char *End;
@@ -823,8 +817,7 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
 static std::string SimplifyConstraint(const char* Constraint,
                                       TargetInfo &Target,
                                       const std::string *OutputNamesBegin = 0,
-                                      const std::string *OutputNamesEnd = 0)
-{
+                                      const std::string *OutputNamesEnd = 0) {
   std::string Result;
   
   while (*Constraint) {
@@ -862,8 +855,7 @@ static std::string SimplifyConstraint(const char* Constraint,
 llvm::Value* CodeGenFunction::EmitAsmInput(const AsmStmt &S,
                                            TargetInfo::ConstraintInfo Info, 
                                            const Expr *InputExpr,
-                                           std::string &ConstraintStr)
-{
+                                           std::string &ConstraintStr) {
   llvm::Value *Arg;
   if ((Info & TargetInfo::CI_AllowsRegister) ||
       !(Info & TargetInfo::CI_AllowsMemory)) {