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
This commit is contained in:
Chris Lattner 2009-03-10 05:39:21 +00:00
parent 1522e2498f
commit 2d43eaefa2
1 changed files with 5 additions and 13 deletions

View 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)) {