summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-10 06:38:02 +0000
committerChris Lattner <sabre@nondot.org>2009-03-10 06:38:02 +0000
commit6dd0f9263de00267885cbb682c615bc72c5dc4e2 (patch)
tree0b8ff117aa711ef7fafec8c3ef2ca6f2d3410aaa
parentd7d5fdf0903ef9855cfd4682a1e85659862786e7 (diff)
downloadbcm5719-llvm-6dd0f9263de00267885cbb682c615bc72c5dc4e2.tar.gz
bcm5719-llvm-6dd0f9263de00267885cbb682c615bc72c5dc4e2.zip
reduce duplication of parsing code between %0 and %x0 and
add support for modifiers on named references, like %c[foo]. llvm-svn: 66532
-rw-r--r--clang/lib/CodeGen/CGStmt.cpp37
-rw-r--r--clang/test/CodeGen/asm.c7
2 files changed, 24 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CGStmt.cpp b/clang/lib/CodeGen/CGStmt.cpp
index 93c4f5b07d7..1aa62e7e036 100644
--- a/clang/lib/CodeGen/CGStmt.cpp
+++ b/clang/lib/CodeGen/CGStmt.cpp
@@ -739,31 +739,27 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
continue;
}
+ // Handle %x4 and %x[foo] by capturing x as the modifier character.
+ char Modifier = '\0';
+ if (isalpha(EscapedChar)) {
+ Modifier = EscapedChar;
+ EscapedChar = *StrStart++;
+ }
+
if (isdigit(EscapedChar)) {
// %n - Assembler operand n
char *End;
unsigned long N = strtoul(StrStart-1, &End, 10);
assert(End != StrStart-1 && "We know that EscapedChar is a digit!");
-
- // FIXME: This should be caught during Sema.
- assert(N < NumOperands && "Operand number out of range!");
-
- Result += '$' + llvm::utostr(N);
StrStart = End;
- continue;
- }
-
- if (isalpha(EscapedChar)) {
- char *End;
- // Skip the single letter escape and read the number, e.g. "%x4".
- unsigned long N = strtoul(StrStart, &End, 10);
- // FIXME: This should be caught during Sema.
- assert(End != StrStart && "Missing operand!");
+
// FIXME: This should be caught during Sema.
assert(N < NumOperands && "Operand number out of range!");
- Result += "${" + llvm::utostr(N) + ':' + EscapedChar + '}';
- StrStart = End;
+ if (Modifier == '\0')
+ Result += '$' + llvm::utostr(N);
+ else
+ Result += "${" + llvm::utostr(N) + ':' + Modifier + '}';
continue;
}
@@ -776,10 +772,13 @@ static std::string ConvertAsmString(const AsmStmt& S, bool &Failed) {
std::string SymbolicName(StrStart, NameEnd);
StrStart = NameEnd+1;
- int OperandIndex = S.getNamedOperand(SymbolicName);
- assert(OperandIndex != -1 && "FIXME: Catch in Sema.");
+ int N = S.getNamedOperand(SymbolicName);
+ assert(N != -1 && "FIXME: Catch in Sema.");
- Result += '$' + llvm::utostr(unsigned(OperandIndex));
+ if (Modifier == '\0')
+ Result += '$' + llvm::utostr(N);
+ else
+ Result += "${" + llvm::utostr(N) + ':' + Modifier + '}';
continue;
}
diff --git a/clang/test/CodeGen/asm.c b/clang/test/CodeGen/asm.c
index 4e6ff4da90f..99655f8bb7c 100644
--- a/clang/test/CodeGen/asm.c
+++ b/clang/test/CodeGen/asm.c
@@ -31,4 +31,9 @@ void t6(void) {
// RUN: grep "T7 NAMED: \$2" %t
void t7(int a) {
__asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
-} \ No newline at end of file
+}
+
+// RUN: grep "T8 NAMED MODIFIER: \${0:c}" %t
+void t8() {
+ __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
+}
OpenPOWER on IntegriCloud