Index: llvm/test/TableGen/AliasAsmString.td =================================================================== --- /dev/null +++ llvm/test/TableGen/AliasAsmString.td @@ -0,0 +1,28 @@ +// RUN: llvm-tblgen -gen-asm-writer -I %p/../../include %s | FileCheck %s + +include "llvm/Target/Target.td" + +def ArchInstrInfo : InstrInfo { } + +def Arch : Target { + let InstructionSet = ArchInstrInfo; +} + +def Reg : Register<"reg">; + +def RegClass : RegisterClass<"foo", [i32], 0, (add Reg)>; + +def IntOperand: Operand; + +def foo : Instruction { + let Size = 2; + let OutOperandList = (outs); + let InOperandList = (ins IntOperand:$imm); + let AsmString = "foo $imm"; + let Namespace = "Arch"; +} + +def FooBraces : InstAlias<"foo \\{$imm\\}", (foo IntOperand:$imm)>; + +// CHECK: static const char AsmStrings[] = +// CHECK-NEXT: /* 0 */ "foo {$\x01}\0" Index: llvm/utils/TableGen/AsmWriterEmitter.cpp =================================================================== --- llvm/utils/TableGen/AsmWriterEmitter.cpp +++ llvm/utils/TableGen/AsmWriterEmitter.cpp @@ -258,6 +258,8 @@ case 't': Str[i] = '\t'; break; case 'v': Str[i] = '\v'; break; case '"': Str[i] = '\"'; break; + case '{': Str[i] = '{'; break; + case '}': Str[i] = '}'; break; case '\'': Str[i] = '\''; break; case '\\': Str[i] = '\\'; break; } @@ -803,6 +805,7 @@ std::string FlatAliasAsmString = CodeGenInstruction::FlattenAsmStringVariants(CGA.AsmString, Variant); + UnescapeString(FlatAliasAsmString); // Don't emit the alias if it has more operands than what it's aliasing. if (NumResultOps < CountNumOperands(FlatAliasAsmString, Variant))