From 63c8b14ddc15147f443806408db6459183af26c1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 10 Mar 2009 05:39:21 +0000 Subject: [PATCH] Expand %= into ${:uid} so that the code generator emits a unique ID for the 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 | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 3fd6526777..5989dcc068 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -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)) { -- 2.40.0