diff options
author | Chris Lattner <sabre@nondot.org> | 2009-03-13 21:33:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-03-13 21:33:17 +0000 |
commit | 8bd06d8e1b31de3ef95c27a705b1025fc33657a7 (patch) | |
tree | 809a6663fb31abc5440a56cf65d9be6669b73db7 /llvm/utils/TableGen/AsmWriterEmitter.cpp | |
parent | a614ef2000fd2885467f2df40c58cb557970675d (diff) | |
download | bcm5719-llvm-8bd06d8e1b31de3ef95c27a705b1025fc33657a7.tar.gz bcm5719-llvm-8bd06d8e1b31de3ef95c27a705b1025fc33657a7.zip |
Fix escaping in asm string literals correctly by having tblgen unescape
them, then the asmprinter emitter reescape them.
llvm-svn: 66958
Diffstat (limited to 'llvm/utils/TableGen/AsmWriterEmitter.cpp')
-rw-r--r-- | llvm/utils/TableGen/AsmWriterEmitter.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp index e7fe8c369bd..93ef6c86a6b 100644 --- a/llvm/utils/TableGen/AsmWriterEmitter.cpp +++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp @@ -130,11 +130,20 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) { // Emit a constant string fragment. if (DollarPos != LastEmitted) { - // TODO: this should eventually handle escaping. - if (CurVariant == Variant || CurVariant == ~0U) - AddLiteralString(std::string(AsmString.begin()+LastEmitted, - AsmString.begin()+DollarPos)); - LastEmitted = DollarPos; + if (CurVariant == Variant || CurVariant == ~0U) { + for (; LastEmitted != DollarPos; ++LastEmitted) + switch (AsmString[LastEmitted]) { + case '\n': AddLiteralString("\\n"); break; + case '\t': AddLiteralString("\\t"); break; + case '"': AddLiteralString("\\\""); break; + case '\\': AddLiteralString("\\\\"); break; + default: + AddLiteralString(std::string(1, AsmString[LastEmitted])); + break; + } + } else { + LastEmitted = DollarPos; + } } else if (AsmString[DollarPos] == '\\') { if (DollarPos+1 != AsmString.size() && (CurVariant == Variant || CurVariant == ~0U)) { |