//===--- HLSLResource.cpp - Helper routines for HLSL resources -----------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file provides shared routines to help analyze HLSL resources and // their bindings during Sema and CodeGen. // //===----------------------------------------------------------------------===// #include "clang/AST/HLSLResource.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/Type.h" using namespace clang; namespace clang { namespace hlsl { void EmbeddedResourceNameBuilder::pushBaseName(llvm::StringRef N) { pushName(N, FieldDelim); Name.append(BaseClassDelim); } void EmbeddedResourceNameBuilder::pushName(llvm::StringRef N, llvm::StringRef Delim) { Offsets.push_back(Name.size()); if (!Name.empty() && !Name.ends_with(BaseClassDelim)) Name.append(Delim); Name.append(N); } void EmbeddedResourceNameBuilder::pushArrayIndex(uint64_t Index) { llvm::raw_svector_ostream OS(Name); Offsets.push_back(Name.size()); OS << ArrayIndexDelim; OS << Index; } void EmbeddedResourceNameBuilder::pushBaseNameHierarchy( CXXRecordDecl *DerivedRD, CXXRecordDecl *BaseRD) { assert(BaseRD != DerivedRD && DerivedRD->isDerivedFrom(BaseRD)); Offsets.push_back(Name.size()); Name.append(FieldDelim); while (BaseRD != DerivedRD) { assert(DerivedRD->getNumBases() == 1 && "HLSL does not support multiple inheritance"); DerivedRD = DerivedRD->bases_begin()->getType()->getAsCXXRecordDecl(); assert(DerivedRD && "base class not found"); Name.append(DerivedRD->getName()); Name.append(BaseClassDelim); } } } // namespace hlsl } // namespace clang