Add a target environment for CoreCLR.

Although targeting CoreCLR is similar to targeting MSVC, there are
certain important differences that the backend must be aware of
(e.g. differences in stack probes, EH, and library calls).

Differential Revision: http://reviews.llvm.org/D11012

llvm-svn: 245115
This commit is contained in:
Pat Gavlin 2015-08-14 22:41:43 +00:00
parent dd175bc6c4
commit b399095c3f
12 changed files with 28 additions and 14 deletions

View File

@ -171,7 +171,8 @@ public:
Itanium,
Cygnus,
AMDOpenCL,
LastEnvironmentType = AMDOpenCL
CoreCLR,
LastEnvironmentType = CoreCLR
};
enum ObjectFormatType {
UnknownObjectFormat,
@ -438,6 +439,10 @@ public:
return getOS() == Triple::Win32 && getEnvironment() == Triple::MSVC;
}
bool isWindowsCoreCLREnvironment() const {
return getOS() == Triple::Win32 && getEnvironment() == Triple::CoreCLR;
}
bool isWindowsItaniumEnvironment() const {
return getOS() == Triple::Win32 && getEnvironment() == Triple::Itanium;
}

View File

@ -197,6 +197,7 @@ const char *Triple::getEnvironmentTypeName(EnvironmentType Kind) {
case Itanium: return "itanium";
case Cygnus: return "cygnus";
case AMDOpenCL: return "amdopencl";
case CoreCLR: return "coreclr";
}
llvm_unreachable("Invalid EnvironmentType!");
@ -432,6 +433,7 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
.StartsWith("itanium", Triple::Itanium)
.StartsWith("cygnus", Triple::Cygnus)
.StartsWith("amdopencl", Triple::AMDOpenCL)
.StartsWith("coreclr", Triple::CoreCLR)
.Default(Triple::UnknownEnvironment);
}

View File

@ -122,7 +122,8 @@ static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI,
} else if (TheTriple.isOSBinFormatELF()) {
// Force the use of an ELF container.
MAI = new X86ELFMCAsmInfo(TheTriple);
} else if (TheTriple.isWindowsMSVCEnvironment()) {
} else if (TheTriple.isWindowsMSVCEnvironment() ||
TheTriple.isWindowsCoreCLREnvironment()) {
MAI = new X86MCAsmInfoMicrosoft(TheTriple);
} else if (TheTriple.isOSCygMing() ||
TheTriple.isWindowsItaniumEnvironment()) {

View File

@ -406,6 +406,10 @@ public:
return TargetTriple.isKnownWindowsMSVCEnvironment();
}
bool isTargetWindowsCoreCLR() const {
return TargetTriple.isWindowsCoreCLREnvironment();
}
bool isTargetWindowsCygwin() const {
return TargetTriple.isWindowsCygwinEnvironment();
}

View File

@ -45,7 +45,7 @@ static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
return make_unique<X86LinuxNaClTargetObjectFile>();
if (TT.isOSBinFormatELF())
return make_unique<X86ELFTargetObjectFile>();
if (TT.isKnownWindowsMSVCEnvironment())
if (TT.isKnownWindowsMSVCEnvironment() || TT.isWindowsCoreCLREnvironment())
return make_unique<X86WindowsTargetObjectFile>();
if (TT.isOSBinFormatCOFF())
return make_unique<TargetLoweringObjectFileCOFF>();

View File

@ -1,7 +1,7 @@
; RUN: opt -S -winehprepare < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
@str.__except = internal unnamed_addr constant [9 x i8] c"__except\00", align 1

View File

@ -1,10 +1,10 @@
; RUN: opt -S -winehprepare < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s
; Check that things work when the mid-level optimizer inlines the finally
; block.
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
%struct._RTL_CRITICAL_SECTION = type { %struct._RTL_CRITICAL_SECTION_DEBUG*, i32, i32, i8*, i8*, i64 }
%struct._RTL_CRITICAL_SECTION_DEBUG = type { i16, i16, %struct._RTL_CRITICAL_SECTION*, %struct._LIST_ENTRY, i32, i32, i32, i16, i16 }

View File

@ -1,4 +1,5 @@
; RUN: opt -S -winehprepare -mtriple=x86_64-windows-msvc < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-windows-coreclr < %s | FileCheck %s
; Test case based on this code:
;
@ -26,7 +27,6 @@
; is nothing like a std::terminate call in this situation.
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
@str_outer_finally = linkonce_odr unnamed_addr constant [18 x i8] c"outer finally %d\0A\00", align 1
@str_inner_finally = linkonce_odr unnamed_addr constant [18 x i8] c"inner finally %d\0A\00", align 1

View File

@ -1,4 +1,5 @@
; RUN: llc < %s | FileCheck %s
; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s
; RUN: llc -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s
; Test case based on this code:
; extern "C" unsigned long _exception_code();
@ -12,7 +13,6 @@
; }
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
; Function Attrs: uwtable
define void @do_except() #0 personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) {

View File

@ -1,7 +1,7 @@
; RUN: opt -S -winehprepare < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-msvc < %s | FileCheck %s
; RUN: opt -S -winehprepare -mtriple=x86_64-pc-windows-coreclr < %s | FileCheck %s
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
declare void @might_crash(i8* %ehptr)
declare i32 @filt()

View File

@ -1,5 +1,7 @@
; RUN: opt -S -winehprepare -mtriple=x86_64-windows-msvc < %s \
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X64
; RUN: opt -S -winehprepare -mtriple=x86_64-windows-coreclr < %s \
; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X64
; This test should also pass in 32-bit using _except_handler3.
; RUN: sed -e 's/__C_specific_handler/_except_handler3/' %s \

View File

@ -6,10 +6,10 @@
; stack probe size equals the page size (4096 bytes for all x86 targets), and
; this is unlikely to change in the future.
;
; RUN: llc < %s | FileCheck %s
; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s
; RUN: llc -mtriple=i686-windows-coreclr < %s | FileCheck %s
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
target triple = "i686-pc-windows-msvc"
define i32 @test1() "stack-probe-size"="0" {
%buffer = alloca [4095 x i8]