From: Chris Lattner Date: Tue, 3 Oct 2006 23:27:09 +0000 (+0000) Subject: Use $( $| $) to represent alternatives in asm blocks instead of {|}. This X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=faf1daeb92bf4db4a6a68d296e24a6e2a4768022;p=oota-llvm.git Use $( $| $) to represent alternatives in asm blocks instead of {|}. This is needed to support targets where {|} aren't special symbols. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@30712 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 7e536aef8df..de58017de96 100644 --- a/lib/CodeGen/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter.cpp @@ -694,12 +694,45 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { break; case '$': { ++LastEmitted; // Consume '$' character. - if (*LastEmitted == '$') { // $$ -> $ + bool Done = true; + + // Handle escapes. + switch (*LastEmitted) { + default: Done = false; break; + case '$': // $$ -> $ if (CurVariant == -1 || CurVariant == AsmPrinterVariant) O << '$'; ++LastEmitted; // Consume second '$' character. break; + case '(': // $( -> same as GCC's { character. + ++LastEmitted; // Consume '(' character. + if (CurVariant != -1) { + std::cerr << "Nested variants found in inline asm string: '" + << AsmStr << "'\n"; + exit(1); + } + CurVariant = 0; // We're in the first variant now. + break; + case '|': + ++LastEmitted; // consume '|' character. + if (CurVariant == -1) { + std::cerr << "Found '|' character outside of variant in inline asm " + << "string: '" << AsmStr << "'\n"; + exit(1); + } + ++CurVariant; // We're in the next variant. + break; + case ')': // $) -> same as GCC's } char. + ++LastEmitted; // consume ')' character. + if (CurVariant == -1) { + std::cerr << "Found '}' character outside of variant in inline asm " + << "string: '" << AsmStr << "'\n"; + exit(1); + } + CurVariant = -1; + break; } + if (Done) break; bool HasCurlyBraces = false; if (*LastEmitted == '{') { // ${variable} @@ -786,33 +819,6 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { } break; } - case '{': - ++LastEmitted; // Consume '{' character. - if (CurVariant != -1) { - std::cerr << "Nested variants found in inline asm string: '" - << AsmStr << "'\n"; - exit(1); - } - CurVariant = 0; // We're in the first variant now. - break; - case '|': - ++LastEmitted; // consume '|' character. - if (CurVariant == -1) { - std::cerr << "Found '|' character outside of variant in inline asm " - << "string: '" << AsmStr << "'\n"; - exit(1); - } - ++CurVariant; // We're in the next variant. - break; - case '}': - ++LastEmitted; // consume '}' character. - if (CurVariant == -1) { - std::cerr << "Found '}' character outside of variant in inline asm " - << "string: '" << AsmStr << "'\n"; - exit(1); - } - CurVariant = -1; - break; } } O << "\n\t" << TAI->getInlineAsmEnd() << "\n";