forked from OSchip/llvm-project
[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:
parent
3661c62e4b
commit
afb72f38f8
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue