summaryrefslogtreecommitdiffstats
path: root/clang/lib
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
commit2d43eaefa2813012c92cb49f5dffa0bbfeb145ba (patch)
tree38eaad1e865ba36d85af78759f08e384d70ef302 /clang/lib
parent1522e2498fc88671170726d5a9a27448c856548f (diff)
downloadbcm5719-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.cpp18
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)) {
OpenPOWER on IntegriCloud