ExprPtr NamedRef::resolve(ModuleBuilder& modBuilder) { auto resolvedExpr = modBuilder.resolveIdent(name); if(!resolvedExpr) throw CompileError(CEUnresolvedIdentifier, 0); return resolvedExpr->doResolve(modBuilder); }
// Map I/O variables to provided offsets, and make bindings for // unbound but live variables. // // Returns false if the input is too malformed to do this. bool TIoMapper::addStage(EShLanguage stage, TIntermediate &intermediate, TInfoSink &infoSink, TIoMapResolver *resolver) { // Trivial return if there is nothing to do. if (intermediate.getShiftSamplerBinding() == 0 && intermediate.getShiftTextureBinding() == 0 && intermediate.getShiftImageBinding() == 0 && intermediate.getShiftUboBinding() == 0 && intermediate.getAutoMapBindings() == false && resolver == nullptr) return true; if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive()) return false; TIntermNode* root = intermediate.getTreeRoot(); if (root == nullptr) return false; // if no resolver is provided, use the default resolver with the given shifts and auto map settings TDefaultIoResolver defaultResolver; if (resolver == nullptr) { defaultResolver.baseSamplerBinding = intermediate.getShiftSamplerBinding(); defaultResolver.baseTextureBinding = intermediate.getShiftTextureBinding(); defaultResolver.baseImageBinding = intermediate.getShiftImageBinding(); defaultResolver.baseUboBinding = intermediate.getShiftUboBinding(); defaultResolver.doAutoMapping = intermediate.getAutoMapBindings(); resolver = &defaultResolver; } TVarLiveMap varMap; TVarGatherTraverser iter_binding_all(intermediate, varMap, true); TVarGatherTraverser iter_binding_live(intermediate, varMap, false); root->traverse(&iter_binding_all); iter_binding_live.pushFunction(intermediate.getEntryPointMangledName().c_str()); while (!iter_binding_live.functions.empty()) { TIntermNode* function = iter_binding_live.functions.back(); iter_binding_live.functions.pop_back(); function->traverse(&iter_binding_live); } // sort entries by priority. see TVarEntryInfo::TOrderByPriority for info. std::sort(varMap.begin(), varMap.end(), TVarEntryInfo::TOrderByPriority()); bool hadError = false; TResolverAdaptor doResolve(stage, *resolver, infoSink, hadError); std::for_each(varMap.begin(), varMap.end(), doResolve); if (!hadError) { // sort by id again, so we can use lower bound to find entries std::sort(varMap.begin(), varMap.end(), TVarEntryInfo::TOrderById()); TVarSetTraverser iter_iomap(intermediate, varMap); root->traverse(&iter_iomap); } return !hadError; }
void resolve () const { if (!_isResolved) doResolve (); }
void* Library::resolve( const char* symbolName ) { load(); return doResolve( symbolName ); }
void RepoAuthType::resolveArray(const UnitEmitter& ue) { auto fn = [&](const uint32_t id) { return ue.lookupArrayType(id); }; doResolve(fn); }