[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

llvm-svn: 256545
This commit is contained in:
Marina Yatsina 2015-12-29 08:49:34 +00:00
parent 3661c62e4b
commit afb72f38f8
2 changed files with 18 additions and 1 deletions

View File

@ -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) {

View File

@ -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;