MC/X86/COFF: Allow quotes in names when targeting MS/Windows,

as MC is the only assembler we support.

This splits MS/Windows and GNU/Windows ASM infos into two seperate classes.
While there is currently only one difference, full MS C++ ABI support will
require many more.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145409 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer 2011-11-29 18:00:06 +00:00
parent b0436a7305
commit 116bc795da
6 changed files with 58 additions and 5 deletions

View File

@ -18,6 +18,16 @@ namespace llvm {
explicit MCAsmInfoCOFF();
};
class MCAsmInfoMicrosoft : public MCAsmInfoCOFF {
protected:
explicit MCAsmInfoMicrosoft();
};
class MCAsmInfoGNUCOFF : public MCAsmInfoCOFF {
protected:
explicit MCAsmInfoGNUCOFF();
};
}

View File

@ -38,3 +38,11 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() {
SupportsDataRegions = false;
}
MCAsmInfoMicrosoft::MCAsmInfoMicrosoft() {
AllowQuotesInName = true;
}
MCAsmInfoGNUCOFF::MCAsmInfoGNUCOFF() {
}

View File

@ -125,7 +125,19 @@ getNonexecutableStackSection(MCContext &Ctx) const {
0, SectionKind::getMetadata());
}
X86MCAsmInfoCOFF::X86MCAsmInfoCOFF(const Triple &Triple) {
X86MCAsmInfoMicrosoft::X86MCAsmInfoMicrosoft(const Triple &Triple) {
if (Triple.getArch() == Triple::x86_64) {
GlobalPrefix = "";
PrivateGlobalPrefix = ".L";
}
AsmTransCBE = x86_asm_table;
AssemblerDialect = AsmWriterFlavor;
TextAlignFillValue = 0x90;
}
X86MCAsmInfoGNUCOFF::X86MCAsmInfoGNUCOFF(const Triple &Triple) {
if (Triple.getArch() == Triple::x86_64) {
GlobalPrefix = "";
PrivateGlobalPrefix = ".L";

View File

@ -38,8 +38,12 @@ namespace llvm {
virtual const MCSection *getNonexecutableStackSection(MCContext &Ctx) const;
};
struct X86MCAsmInfoCOFF : public MCAsmInfoCOFF {
explicit X86MCAsmInfoCOFF(const Triple &Triple);
struct X86MCAsmInfoMicrosoft : public MCAsmInfoMicrosoft {
explicit X86MCAsmInfoMicrosoft(const Triple &Triple);
};
struct X86MCAsmInfoGNUCOFF : public MCAsmInfoGNUCOFF {
explicit X86MCAsmInfoGNUCOFF(const Triple &Triple);
};
} // namespace llvm

View File

@ -361,8 +361,10 @@ static MCAsmInfo *createX86MCAsmInfo(const Target &T, StringRef TT) {
MAI = new X86_64MCAsmInfoDarwin(TheTriple);
else
MAI = new X86MCAsmInfoDarwin(TheTriple);
} else if (TheTriple.isOSWindows()) {
MAI = new X86MCAsmInfoCOFF(TheTriple);
} else if (TheTriple.getOS() == Triple::Win32) {
MAI = new X86MCAsmInfoMicrosoft(TheTriple);
} else if (TheTriple.getOS() == Triple::MinGW32 || TheTriple.getOS() == Triple::Cygwin) {
MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
} else {
MAI = new X86ELFMCAsmInfo(TheTriple);
}

View File

@ -0,0 +1,17 @@
; The purpose of this test is to see if the MC layer properly handles symbol
; names needing quoting on MS/Windows. This code is generated by clang when
; using -cxx-abi microsoft.
; RUN: llc -filetype=asm -mtriple i686-pc-win32 %s -o - | FileCheck %s
; CHECK: ?sayhi@A@@QBEXXZ
%struct.A = type {}
define i32 @main() {
entry:
tail call void @"\01?sayhi@A@@QBEXXZ"(%struct.A* null)
ret i32 0
}
declare void @"\01?sayhi@A@@QBEXXZ"(%struct.A*)