forked from OSchip/llvm-project
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:
parent
1522e2498f
commit
2d43eaefa2
|
@ -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)) {
|
||||
|
|
Loading…
Reference in New Issue