@@ -2010,60 +2010,6 @@ static Type *parseTypeString(const StringRef Name, LLVMContext &Context) {
20102010 llvm_unreachable (" Unable to recognize type!" );
20112011}
20122012
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-
20672013// ===----------------------------------------------------------------------===//
20682014// Implementation functions for builtin types.
20692015// ===----------------------------------------------------------------------===//
@@ -2127,6 +2073,56 @@ static SPIRVType *getSampledImageType(const TargetExtType *OpaqueType,
21272073}
21282074
21292075namespace 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+
21302126SPIRVType *lowerBuiltinType (const Type *OpaqueType,
21312127 SPIRV::AccessQualifier::AccessQualifier AccessQual,
21322128 MachineIRBuilder &MIRBuilder,
@@ -2141,7 +2137,8 @@ SPIRVType *lowerBuiltinType(const Type *OpaqueType,
21412137 // will be removed in the future release of LLVM.
21422138 const TargetExtType *BuiltinType = dyn_cast<TargetExtType>(OpaqueType);
21432139 if (!BuiltinType)
2144- BuiltinType = parseToTargetExtType (OpaqueType, MIRBuilder);
2140+ BuiltinType = parseBuiltinTypeNameToTargetExtType (
2141+ OpaqueType->getStructName ().str (), MIRBuilder);
21452142
21462143 unsigned NumStartingVRegs = MIRBuilder.getMRI ()->getNumVirtRegs ();
21472144
0 commit comments