diff options
author | Chris Lattner <sabre@nondot.org> | 2006-10-03 23:27:09 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-10-03 23:27:09 +0000 |
commit | faf1daeb92bf4db4a6a68d296e24a6e2a4768022 (patch) | |
tree | 6501da787950031a3b69848b9a6f79ffe39fc3cd /lib/CodeGen | |
parent | bf497a3a68b18472d8ad755bf483588b0caaa8cb (diff) |
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
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/AsmPrinter.cpp | 62 |
1 files changed, 34 insertions, 28 deletions
diff --git a/lib/CodeGen/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter.cpp index 7e536aef8d..de58017de9 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"; |