diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-10 05:39:21 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-10 05:39:21 +0000 |
commit | 63c8b14ddc15147f443806408db6459183af26c1 (patch) | |
tree | 72d3394e00acc3d177c723dc6070d1b72369133a /lib/CodeGen/CGStmt.cpp | |
parent | 0e5c8d4ca6c7e472ddde13495c8d3558983de85a (diff) |
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
Diffstat (limited to 'lib/CodeGen/CGStmt.cpp')
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 18 |
1 files 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)) { |