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:
parent
dd175bc6c4
commit
b399095c3f
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -406,6 +406,10 @@ public:
|
|||
return TargetTriple.isKnownWindowsMSVCEnvironment();
|
||||
}
|
||||
|
||||
bool isTargetWindowsCoreCLR() const {
|
||||
return TargetTriple.isWindowsCoreCLREnvironment();
|
||||
}
|
||||
|
||||
bool isTargetWindowsCygwin() const {
|
||||
return TargetTriple.isWindowsCygwinEnvironment();
|
||||
}
|
||||
|
|
|
@ -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>();
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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]
|
||||
|
|
Loading…
Reference in New Issue