mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
Add in support for SPIR to LLVM core. This adds a new target and two new calling conventions.
llvm-svn: 164948
This commit is contained in:
parent
f2905fc76e
commit
c2b360eb5b
@ -65,7 +65,8 @@ public:
|
||||
nvptx, // NVPTX: 32-bit
|
||||
nvptx64, // NVPTX: 64-bit
|
||||
le32, // le32: generic little-endian 32-bit CPU (PNaCl / Emscripten)
|
||||
amdil // amdil: amd IL
|
||||
amdil, // amdil: amd IL
|
||||
spir // SPIR: standard portable IR for OpenCL
|
||||
};
|
||||
enum VendorType {
|
||||
UnknownVendor,
|
||||
|
@ -94,7 +94,25 @@ namespace CallingConv {
|
||||
|
||||
/// MBLAZE_INTR - Calling convention used for MBlaze interrupt support
|
||||
/// routines (i.e. GCC's save_volatiles attribute).
|
||||
MBLAZE_SVOL = 74
|
||||
MBLAZE_SVOL = 74,
|
||||
|
||||
/// SPIR_FUNC - Calling convention for SPIR non-kernel device functions.
|
||||
/// No lowering or expansion of arguments.
|
||||
/// Structures are passed as a pointer to a struct with the byval attribute.
|
||||
/// Functions can only call SPIR_FUNC and SPIR_KERNEL functions.
|
||||
/// Functions can only have zero or one return values.
|
||||
/// Variable arguments are not allowed, except for printf.
|
||||
/// How arguments/return values are lowered are not specified.
|
||||
/// Functions are only visible to the devices.
|
||||
SPIR_FUNC = 75,
|
||||
|
||||
/// SPIR_KERNEL - Calling convention for SPIR kernel functions.
|
||||
/// Inherits the restrictions of SPIR_FUNC, except
|
||||
/// Cannot have non-void return values.
|
||||
/// Cannot have variable arguments.
|
||||
/// Can also be called by the host.
|
||||
/// Is externally visible.
|
||||
SPIR_KERNEL = 76
|
||||
};
|
||||
} // End CallingConv namespace
|
||||
|
||||
|
@ -525,6 +525,8 @@ lltok::Kind LLLexer::LexIdentifier() {
|
||||
KEYWORD(msp430_intrcc);
|
||||
KEYWORD(ptx_kernel);
|
||||
KEYWORD(ptx_device);
|
||||
KEYWORD(spir_kernel);
|
||||
KEYWORD(spir_func);
|
||||
|
||||
KEYWORD(cc);
|
||||
KEYWORD(c);
|
||||
|
@ -1101,6 +1101,8 @@ bool LLParser::ParseOptionalVisibility(unsigned &Res) {
|
||||
/// ::= 'msp430_intrcc'
|
||||
/// ::= 'ptx_kernel'
|
||||
/// ::= 'ptx_device'
|
||||
/// ::= 'spir_func'
|
||||
/// ::= 'spir_kernel'
|
||||
/// ::= 'cc' UINT
|
||||
///
|
||||
bool LLParser::ParseOptionalCallingConv(CallingConv::ID &CC) {
|
||||
@ -1118,6 +1120,8 @@ bool LLParser::ParseOptionalCallingConv(CallingConv::ID &CC) {
|
||||
case lltok::kw_msp430_intrcc: CC = CallingConv::MSP430_INTR; break;
|
||||
case lltok::kw_ptx_kernel: CC = CallingConv::PTX_Kernel; break;
|
||||
case lltok::kw_ptx_device: CC = CallingConv::PTX_Device; break;
|
||||
case lltok::kw_spir_kernel: CC = CallingConv::SPIR_KERNEL; break;
|
||||
case lltok::kw_spir_func: CC = CallingConv::SPIR_FUNC; break;
|
||||
case lltok::kw_cc: {
|
||||
unsigned ArbitraryCC;
|
||||
Lex.Lex();
|
||||
|
@ -81,6 +81,7 @@ namespace lltok {
|
||||
kw_arm_apcscc, kw_arm_aapcscc, kw_arm_aapcs_vfpcc,
|
||||
kw_msp430_intrcc,
|
||||
kw_ptx_kernel, kw_ptx_device,
|
||||
kw_spir_kernel, kw_spir_func,
|
||||
|
||||
kw_signext,
|
||||
kw_zeroext,
|
||||
|
@ -42,6 +42,7 @@ const char *Triple::getArchTypeName(ArchType Kind) {
|
||||
case nvptx64: return "nvptx64";
|
||||
case le32: return "le32";
|
||||
case amdil: return "amdil";
|
||||
case spir: return "spir";
|
||||
}
|
||||
|
||||
llvm_unreachable("Invalid ArchType!");
|
||||
@ -83,6 +84,7 @@ const char *Triple::getArchTypePrefix(ArchType Kind) {
|
||||
case nvptx64: return "nvptx";
|
||||
case le32: return "le32";
|
||||
case amdil: return "amdil";
|
||||
case spir: return "spir";
|
||||
}
|
||||
}
|
||||
|
||||
@ -171,6 +173,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
|
||||
.Case("nvptx64", nvptx64)
|
||||
.Case("le32", le32)
|
||||
.Case("amdil", amdil)
|
||||
.Case("spir", spir)
|
||||
.Default(UnknownArch);
|
||||
}
|
||||
|
||||
@ -202,6 +205,7 @@ Triple::ArchType Triple::getArchTypeForDarwinArchName(StringRef Str) {
|
||||
.Case("nvptx", Triple::nvptx)
|
||||
.Case("nvptx64", Triple::nvptx64)
|
||||
.Case("amdil", Triple::amdil)
|
||||
.Case("spir", Triple::spir)
|
||||
.Default(Triple::UnknownArch);
|
||||
}
|
||||
|
||||
@ -226,6 +230,7 @@ const char *Triple::getArchNameForAssembler() {
|
||||
.Case("nvptx64", "nvptx64")
|
||||
.Case("le32", "le32")
|
||||
.Case("amdil", "amdil")
|
||||
.Case("spir", "spir")
|
||||
.Default(NULL);
|
||||
}
|
||||
|
||||
@ -260,6 +265,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
|
||||
.Case("nvptx64", Triple::nvptx64)
|
||||
.Case("le32", Triple::le32)
|
||||
.Case("amdil", Triple::amdil)
|
||||
.Case("spir", Triple::spir)
|
||||
.Default(Triple::UnknownArch);
|
||||
}
|
||||
|
||||
@ -670,6 +676,7 @@ void Triple::setOSAndEnvironmentName(StringRef Str) {
|
||||
|
||||
static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
|
||||
switch (Arch) {
|
||||
case llvm::Triple::spir:
|
||||
case llvm::Triple::UnknownArch:
|
||||
return 0;
|
||||
|
||||
@ -726,6 +733,7 @@ Triple Triple::get32BitArchVariant() const {
|
||||
break;
|
||||
|
||||
case Triple::amdil:
|
||||
case Triple::spir:
|
||||
case Triple::arm:
|
||||
case Triple::cellspu:
|
||||
case Triple::hexagon:
|
||||
@ -772,6 +780,7 @@ Triple Triple::get64BitArchVariant() const {
|
||||
T.setArch(UnknownArch);
|
||||
break;
|
||||
|
||||
case Triple::spir:
|
||||
case Triple::mips64:
|
||||
case Triple::mips64el:
|
||||
case Triple::nvptx64:
|
||||
|
Loading…
x
Reference in New Issue
Block a user