From 08f721d1dea00dadb3242883e249b51054dd7452 Mon Sep 17 00:00:00 2001 From: Pat Gavlin Date: Fri, 14 Aug 2015 22:41:43 +0000 Subject: [PATCH] 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245115 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/Triple.h | 7 ++++++- lib/Support/Triple.cpp | 2 ++ lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp | 3 ++- lib/Target/X86/X86Subtarget.h | 4 ++++ lib/Target/X86/X86TargetMachine.cpp | 2 +- test/CodeGen/WinEH/seh-catch-all.ll | 4 ++-- test/CodeGen/WinEH/seh-inlined-finally.ll | 4 ++-- test/CodeGen/WinEH/seh-outlined-finally.ll | 2 +- test/CodeGen/WinEH/seh-prepared-basic.ll | 4 ++-- test/CodeGen/WinEH/seh-resume-phi.ll | 4 ++-- test/CodeGen/WinEH/seh-simple.ll | 2 ++ test/CodeGen/X86/stack-probe-size.ll | 4 ++-- 12 files changed, 28 insertions(+), 14 deletions(-) diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h index e6239bc1bf3..3606ae76db6 100644 --- a/include/llvm/ADT/Triple.h +++ b/include/llvm/ADT/Triple.h @@ -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; } diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index f1b009e19e1..a946e19f53b 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -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); } diff --git a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index 83b4091d766..7a453fea23b 100644 --- a/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -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()) { diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h index f026d4295f7..14e0088bc9b 100644 --- a/lib/Target/X86/X86Subtarget.h +++ b/lib/Target/X86/X86Subtarget.h @@ -406,6 +406,10 @@ public: return TargetTriple.isKnownWindowsMSVCEnvironment(); } + bool isTargetWindowsCoreCLR() const { + return TargetTriple.isWindowsCoreCLREnvironment(); + } + bool isTargetWindowsCygwin() const { return TargetTriple.isWindowsCygwinEnvironment(); } diff --git a/lib/Target/X86/X86TargetMachine.cpp b/lib/Target/X86/X86TargetMachine.cpp index fb9cb4ba4c8..a9b6b74f7d2 100644 --- a/lib/Target/X86/X86TargetMachine.cpp +++ b/lib/Target/X86/X86TargetMachine.cpp @@ -45,7 +45,7 @@ static std::unique_ptr createTLOF(const Triple &TT) { return make_unique(); if (TT.isOSBinFormatELF()) return make_unique(); - if (TT.isKnownWindowsMSVCEnvironment()) + if (TT.isKnownWindowsMSVCEnvironment() || TT.isWindowsCoreCLREnvironment()) return make_unique(); if (TT.isOSBinFormatCOFF()) return make_unique(); diff --git a/test/CodeGen/WinEH/seh-catch-all.ll b/test/CodeGen/WinEH/seh-catch-all.ll index 5ac2295a5b4..1255496f78f 100644 --- a/test/CodeGen/WinEH/seh-catch-all.ll +++ b/test/CodeGen/WinEH/seh-catch-all.ll @@ -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 diff --git a/test/CodeGen/WinEH/seh-inlined-finally.ll b/test/CodeGen/WinEH/seh-inlined-finally.ll index 157adf0c818..07fe6000867 100644 --- a/test/CodeGen/WinEH/seh-inlined-finally.ll +++ b/test/CodeGen/WinEH/seh-inlined-finally.ll @@ -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 } diff --git a/test/CodeGen/WinEH/seh-outlined-finally.ll b/test/CodeGen/WinEH/seh-outlined-finally.ll index 529f85b9602..b46b4e97672 100644 --- a/test/CodeGen/WinEH/seh-outlined-finally.ll +++ b/test/CodeGen/WinEH/seh-outlined-finally.ll @@ -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 diff --git a/test/CodeGen/WinEH/seh-prepared-basic.ll b/test/CodeGen/WinEH/seh-prepared-basic.ll index b6a30309f1c..d4ff04c9fe1 100644 --- a/test/CodeGen/WinEH/seh-prepared-basic.ll +++ b/test/CodeGen/WinEH/seh-prepared-basic.ll @@ -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*) { diff --git a/test/CodeGen/WinEH/seh-resume-phi.ll b/test/CodeGen/WinEH/seh-resume-phi.ll index d2bd64167d2..4ce55193dc4 100644 --- a/test/CodeGen/WinEH/seh-resume-phi.ll +++ b/test/CodeGen/WinEH/seh-resume-phi.ll @@ -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() diff --git a/test/CodeGen/WinEH/seh-simple.ll b/test/CodeGen/WinEH/seh-simple.ll index 060186484ae..9974548ba33 100644 --- a/test/CodeGen/WinEH/seh-simple.ll +++ b/test/CodeGen/WinEH/seh-simple.ll @@ -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 \ diff --git a/test/CodeGen/X86/stack-probe-size.ll b/test/CodeGen/X86/stack-probe-size.ll index 21482c3abde..43c62c113f8 100644 --- a/test/CodeGen/X86/stack-probe-size.ll +++ b/test/CodeGen/X86/stack-probe-size.ll @@ -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] -- 2.11.0