From 02af974dca0f855dc36d8a8c26bb87f373310815 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 10 Mar 2009 06:38:02 +0000 Subject: [PATCH] reduce duplication of parsing code between %0 and %x0 and add support for modifiers on named references, like %c[foo]. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66532 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGStmt.cpp | 37 ++++++++++++++++++------------------- test/CodeGen/asm.c | 7 ++++++- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index 93c4f5b07d..1aa62e7e03 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/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/test/CodeGen/asm.c b/test/CodeGen/asm.c index 4e6ff4da90..99655f8bb7 100644 --- a/test/CodeGen/asm.c +++ b/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)); +} -- 2.40.0