//===-- Utils.cpp ---------------------------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// // // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ // //===----------------------------------------------------------------------===// #include "flang/Optimizer/Support/Utils.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "flang/Optimizer/Support/InternalNames.h" fir::TypeInfoOp fir::lookupTypeInfoOp(fir::RecordType recordType, mlir::ModuleOp module, const mlir::SymbolTable *symbolTable) { // fir.type_info was created with the mangled name of the derived type. // It is the same as the name in the related fir.type, except when a pass // lowered the fir.type (e.g., when lowering fir.boxproc type if the type has // pointer procedure components), in which case suffix may have been added to // the fir.type name. Get rid of them when looking up for the fir.type_info. llvm::StringRef originalMangledTypeName = fir::NameUniquer::dropTypeConversionMarkers(recordType.getName()); return fir::lookupTypeInfoOp(originalMangledTypeName, module, symbolTable); } fir::TypeInfoOp fir::lookupTypeInfoOp(llvm::StringRef name, mlir::ModuleOp module, const mlir::SymbolTable *symbolTable) { if (symbolTable) if (auto typeInfo = symbolTable->lookup(name)) return typeInfo; return module.lookupSymbol(name); } std::optional> fir::getComponentLowerBoundsIfNonDefault( fir::RecordType recordType, llvm::StringRef component, mlir::ModuleOp module, const mlir::SymbolTable *symbolTable) { fir::TypeInfoOp typeInfo = fir::lookupTypeInfoOp(recordType, module, symbolTable); if (!typeInfo || typeInfo.getComponentInfo().empty()) return std::nullopt; for (auto componentInfo : typeInfo.getComponentInfo().getOps()) if (componentInfo.getName() == component) return componentInfo.getLowerBounds(); return std::nullopt; }