aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-10-03 23:27:09 +0000
committerChris Lattner <sabre@nondot.org>2006-10-03 23:27:09 +0000
commitfaf1daeb92bf4db4a6a68d296e24a6e2a4768022 (patch)
tree6501da787950031a3b69848b9a6f79ffe39fc3cd /lib/CodeGen
parentbf497a3a68b18472d8ad755bf483588b0caaa8cb (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.cpp62
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";