aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGStmt.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-10 05:39:21 +0000
committerChris Lattner <sabre@nondot.org>2009-03-10 05:39:21 +0000
commit63c8b14ddc15147f443806408db6459183af26c1 (patch)
tree72d3394e00acc3d177c723dc6070d1b72369133a /lib/CodeGen/CGStmt.cpp
parent0e5c8d4ca6c7e472ddde13495c8d3558983de85a (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.cpp18
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)) {