From: Marina Yatsina Date: Tue, 29 Dec 2015 08:49:34 +0000 (+0000) Subject: [ms inline asm] Add support for label names with '$' chars X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b94e85d194919b5ab11862713b74da82021a4178;p=clang [ms inline asm] Add support for label names with '$' chars In MS inline asm syntax a label with '$' char produces an error, while in AT&T it does not. In AT&T inline asm syntax Clang escapes the '$' char and replaces it with "$$". Adopted same approach for MS syntax. Differential Revision: http://reviews.llvm.org/D15795 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@256545 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 2917c5a360..0d6e0f8e41 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -750,7 +750,15 @@ LabelDecl *Sema::GetOrCreateMSAsmLabel(StringRef ExternalLabelName, // Create an internal name for the label. The name should not be a valid mangled // name, and should be unique. We use a dot to make the name an invalid mangled // name. - OS << "__MSASMLABEL_." << MSAsmLabelNameCounter++ << "__" << ExternalLabelName; + OS << "__MSASMLABEL_." << MSAsmLabelNameCounter++ << "__"; + for (auto it = ExternalLabelName.begin(); it != ExternalLabelName.end(); + ++it) { + OS << *it; + if (*it == '$') { + // We escape '$' in asm strings by replacing it with "$$" + OS << '$'; + } + } Label->setMSAsmLabel(OS.str()); } if (AlwaysCreate) { diff --git a/test/CodeGen/ms-inline-asm.c b/test/CodeGen/ms-inline-asm.c index 619d3bceb8..2f5de676c7 100644 --- a/test/CodeGen/ms-inline-asm.c +++ b/test/CodeGen/ms-inline-asm.c @@ -616,6 +616,15 @@ void label4() { // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.4__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.4__label", "~{eax},~{dirflag},~{fpsr},~{flags}"() } +void label5() { + __asm { + jmp dollar_label$ + dollar_label$: + } + // CHECK-LABEL: define void @label5 + // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.5__dollar_label$$\0A\09{{.*}}__MSASMLABEL_.5__dollar_label$$:", "~{dirflag},~{fpsr},~{flags}"() +} + typedef union _LARGE_INTEGER { struct { unsigned int LowPart;