@@ -2010,60 +2010,6 @@ static Type *parseTypeString(const StringRef Name, LLVMContext &Context) {
2010
2010
llvm_unreachable (" Unable to recognize type!" );
2011
2011
}
2012
2012
2013
- static const TargetExtType *parseToTargetExtType (const Type *OpaqueType,
2014
- MachineIRBuilder &MIRBuilder) {
2015
- assert (isSpecialOpaqueType (OpaqueType) &&
2016
- " Not a SPIR-V/OpenCL special opaque type!" );
2017
- assert (!OpaqueType->isTargetExtTy () &&
2018
- " This already is SPIR-V/OpenCL TargetExtType!" );
2019
-
2020
- StringRef NameWithParameters = OpaqueType->getStructName ();
2021
-
2022
- // Pointers-to-opaque-structs representing OpenCL types are first translated
2023
- // to equivalent SPIR-V types. OpenCL builtin type names should have the
2024
- // following format: e.g. %opencl.event_t
2025
- if (NameWithParameters.startswith (" opencl." )) {
2026
- const SPIRV::OpenCLType *OCLTypeRecord =
2027
- SPIRV::lookupOpenCLType (NameWithParameters);
2028
- if (!OCLTypeRecord)
2029
- report_fatal_error (" Missing TableGen record for OpenCL type: " +
2030
- NameWithParameters);
2031
- NameWithParameters = OCLTypeRecord->SpirvTypeLiteral ;
2032
- // Continue with the SPIR-V builtin type...
2033
- }
2034
-
2035
- // Names of the opaque structs representing a SPIR-V builtins without
2036
- // parameters should have the following format: e.g. %spirv.Event
2037
- assert (NameWithParameters.startswith (" spirv." ) &&
2038
- " Unknown builtin opaque type!" );
2039
-
2040
- // Parameterized SPIR-V builtins names follow this format:
2041
- // e.g. %spirv.Image._void_1_0_0_0_0_0_0, %spirv.Pipe._0
2042
- if (NameWithParameters.find (' _' ) == std::string::npos)
2043
- return TargetExtType::get (OpaqueType->getContext (), NameWithParameters);
2044
-
2045
- SmallVector<StringRef> Parameters;
2046
- unsigned BaseNameLength = NameWithParameters.find (' _' ) - 1 ;
2047
- SplitString (NameWithParameters.substr (BaseNameLength + 1 ), Parameters, " _" );
2048
-
2049
- SmallVector<Type *, 1 > TypeParameters;
2050
- bool HasTypeParameter = !isDigit (Parameters[0 ][0 ]);
2051
- if (HasTypeParameter)
2052
- TypeParameters.push_back (parseTypeString (
2053
- Parameters[0 ], MIRBuilder.getMF ().getFunction ().getContext ()));
2054
- SmallVector<unsigned > IntParameters;
2055
- for (unsigned i = HasTypeParameter ? 1 : 0 ; i < Parameters.size (); i++) {
2056
- unsigned IntParameter = 0 ;
2057
- bool ValidLiteral = !Parameters[i].getAsInteger (10 , IntParameter);
2058
- assert (ValidLiteral &&
2059
- " Invalid format of SPIR-V builtin parameter literal!" );
2060
- IntParameters.push_back (IntParameter);
2061
- }
2062
- return TargetExtType::get (OpaqueType->getContext (),
2063
- NameWithParameters.substr (0 , BaseNameLength),
2064
- TypeParameters, IntParameters);
2065
- }
2066
-
2067
2013
// ===----------------------------------------------------------------------===//
2068
2014
// Implementation functions for builtin types.
2069
2015
// ===----------------------------------------------------------------------===//
@@ -2127,6 +2073,56 @@ static SPIRVType *getSampledImageType(const TargetExtType *OpaqueType,
2127
2073
}
2128
2074
2129
2075
namespace SPIRV {
2076
+ const TargetExtType *
2077
+ parseBuiltinTypeNameToTargetExtType (std::string TypeName,
2078
+ MachineIRBuilder &MIRBuilder) {
2079
+ StringRef NameWithParameters = TypeName;
2080
+
2081
+ // Pointers-to-opaque-structs representing OpenCL types are first translated
2082
+ // to equivalent SPIR-V types. OpenCL builtin type names should have the
2083
+ // following format: e.g. %opencl.event_t
2084
+ if (NameWithParameters.startswith (" opencl." )) {
2085
+ const SPIRV::OpenCLType *OCLTypeRecord =
2086
+ SPIRV::lookupOpenCLType (NameWithParameters);
2087
+ if (!OCLTypeRecord)
2088
+ report_fatal_error (" Missing TableGen record for OpenCL type: " +
2089
+ NameWithParameters);
2090
+ NameWithParameters = OCLTypeRecord->SpirvTypeLiteral ;
2091
+ // Continue with the SPIR-V builtin type...
2092
+ }
2093
+
2094
+ // Names of the opaque structs representing a SPIR-V builtins without
2095
+ // parameters should have the following format: e.g. %spirv.Event
2096
+ assert (NameWithParameters.startswith (" spirv." ) &&
2097
+ " Unknown builtin opaque type!" );
2098
+
2099
+ // Parameterized SPIR-V builtins names follow this format:
2100
+ // e.g. %spirv.Image._void_1_0_0_0_0_0_0, %spirv.Pipe._0
2101
+ if (NameWithParameters.find (' _' ) == std::string::npos)
2102
+ return TargetExtType::get (MIRBuilder.getContext (), NameWithParameters);
2103
+
2104
+ SmallVector<StringRef> Parameters;
2105
+ unsigned BaseNameLength = NameWithParameters.find (' _' ) - 1 ;
2106
+ SplitString (NameWithParameters.substr (BaseNameLength + 1 ), Parameters, " _" );
2107
+
2108
+ SmallVector<Type *, 1 > TypeParameters;
2109
+ bool HasTypeParameter = !isDigit (Parameters[0 ][0 ]);
2110
+ if (HasTypeParameter)
2111
+ TypeParameters.push_back (parseTypeString (
2112
+ Parameters[0 ], MIRBuilder.getMF ().getFunction ().getContext ()));
2113
+ SmallVector<unsigned > IntParameters;
2114
+ for (unsigned i = HasTypeParameter ? 1 : 0 ; i < Parameters.size (); i++) {
2115
+ unsigned IntParameter = 0 ;
2116
+ bool ValidLiteral = !Parameters[i].getAsInteger (10 , IntParameter);
2117
+ assert (ValidLiteral &&
2118
+ " Invalid format of SPIR-V builtin parameter literal!" );
2119
+ IntParameters.push_back (IntParameter);
2120
+ }
2121
+ return TargetExtType::get (MIRBuilder.getContext (),
2122
+ NameWithParameters.substr (0 , BaseNameLength),
2123
+ TypeParameters, IntParameters);
2124
+ }
2125
+
2130
2126
SPIRVType *lowerBuiltinType (const Type *OpaqueType,
2131
2127
SPIRV::AccessQualifier::AccessQualifier AccessQual,
2132
2128
MachineIRBuilder &MIRBuilder,
@@ -2141,7 +2137,8 @@ SPIRVType *lowerBuiltinType(const Type *OpaqueType,
2141
2137
// will be removed in the future release of LLVM.
2142
2138
const TargetExtType *BuiltinType = dyn_cast<TargetExtType>(OpaqueType);
2143
2139
if (!BuiltinType)
2144
- BuiltinType = parseToTargetExtType (OpaqueType, MIRBuilder);
2140
+ BuiltinType = parseBuiltinTypeNameToTargetExtType (
2141
+ OpaqueType->getStructName ().str (), MIRBuilder);
2145
2142
2146
2143
unsigned NumStartingVRegs = MIRBuilder.getMRI ()->getNumVirtRegs ();
2147
2144
0 commit comments