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 | 2d43eaefa2813012c92cb49f5dffa0bbfeb145ba (patch) | |
tree | 38eaad1e865ba36d85af78759f08e384d70ef302 /clang/lib | |
parent | 1522e2498fc88671170726d5a9a27448c856548f (diff) | |
download | bcm5719-llvm-2d43eaefa2813012c92cb49f5dffa0bbfeb145ba.tar.gz bcm5719-llvm-2d43eaefa2813012c92cb49f5dffa0bbfeb145ba.zip |
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.
llvm-svn: 66528
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGStmt.cpp | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp index 3fd65267771..5989dcc0680 100644 --- a/clang/lib/CodeGen/CGStmt.cpp +++ b/clang/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)) { |