xref: /llvm-project/flang/lib/Optimizer/Support/Utils.cpp (revision 66d5ca2a3d8df780951ce2987157ef03e73393c7)
1*66d5ca2aSjeanPerier //===-- Utils.cpp ---------------------------------------------------------===//
2*66d5ca2aSjeanPerier //
3*66d5ca2aSjeanPerier // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*66d5ca2aSjeanPerier // See https://llvm.org/LICENSE.txt for license information.
5*66d5ca2aSjeanPerier // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*66d5ca2aSjeanPerier //
7*66d5ca2aSjeanPerier //===----------------------------------------------------------------------===//
8*66d5ca2aSjeanPerier //
9*66d5ca2aSjeanPerier // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/
10*66d5ca2aSjeanPerier //
11*66d5ca2aSjeanPerier //===----------------------------------------------------------------------===//
12*66d5ca2aSjeanPerier 
13*66d5ca2aSjeanPerier #include "flang/Optimizer/Support/Utils.h"
14*66d5ca2aSjeanPerier #include "flang/Optimizer/Dialect/FIROps.h"
15*66d5ca2aSjeanPerier #include "flang/Optimizer/Dialect/FIRType.h"
16*66d5ca2aSjeanPerier #include "flang/Optimizer/Support/InternalNames.h"
17*66d5ca2aSjeanPerier 
lookupTypeInfoOp(fir::RecordType recordType,mlir::ModuleOp module,const mlir::SymbolTable * symbolTable)18*66d5ca2aSjeanPerier fir::TypeInfoOp fir::lookupTypeInfoOp(fir::RecordType recordType,
19*66d5ca2aSjeanPerier                                       mlir::ModuleOp module,
20*66d5ca2aSjeanPerier                                       const mlir::SymbolTable *symbolTable) {
21*66d5ca2aSjeanPerier   // fir.type_info was created with the mangled name of the derived type.
22*66d5ca2aSjeanPerier   // It is the same as the name in the related fir.type, except when a pass
23*66d5ca2aSjeanPerier   // lowered the fir.type (e.g., when lowering fir.boxproc type if the type has
24*66d5ca2aSjeanPerier   // pointer procedure components), in which case suffix may have been added to
25*66d5ca2aSjeanPerier   // the fir.type name. Get rid of them when looking up for the fir.type_info.
26*66d5ca2aSjeanPerier   llvm::StringRef originalMangledTypeName =
27*66d5ca2aSjeanPerier       fir::NameUniquer::dropTypeConversionMarkers(recordType.getName());
28*66d5ca2aSjeanPerier   return fir::lookupTypeInfoOp(originalMangledTypeName, module, symbolTable);
29*66d5ca2aSjeanPerier }
30*66d5ca2aSjeanPerier 
lookupTypeInfoOp(llvm::StringRef name,mlir::ModuleOp module,const mlir::SymbolTable * symbolTable)31*66d5ca2aSjeanPerier fir::TypeInfoOp fir::lookupTypeInfoOp(llvm::StringRef name,
32*66d5ca2aSjeanPerier                                       mlir::ModuleOp module,
33*66d5ca2aSjeanPerier                                       const mlir::SymbolTable *symbolTable) {
34*66d5ca2aSjeanPerier   if (symbolTable)
35*66d5ca2aSjeanPerier     if (auto typeInfo = symbolTable->lookup<fir::TypeInfoOp>(name))
36*66d5ca2aSjeanPerier       return typeInfo;
37*66d5ca2aSjeanPerier   return module.lookupSymbol<fir::TypeInfoOp>(name);
38*66d5ca2aSjeanPerier }
39*66d5ca2aSjeanPerier 
getComponentLowerBoundsIfNonDefault(fir::RecordType recordType,llvm::StringRef component,mlir::ModuleOp module,const mlir::SymbolTable * symbolTable)40*66d5ca2aSjeanPerier std::optional<llvm::ArrayRef<int64_t>> fir::getComponentLowerBoundsIfNonDefault(
41*66d5ca2aSjeanPerier     fir::RecordType recordType, llvm::StringRef component,
42*66d5ca2aSjeanPerier     mlir::ModuleOp module, const mlir::SymbolTable *symbolTable) {
43*66d5ca2aSjeanPerier   fir::TypeInfoOp typeInfo =
44*66d5ca2aSjeanPerier       fir::lookupTypeInfoOp(recordType, module, symbolTable);
45*66d5ca2aSjeanPerier   if (!typeInfo || typeInfo.getComponentInfo().empty())
46*66d5ca2aSjeanPerier     return std::nullopt;
47*66d5ca2aSjeanPerier   for (auto componentInfo :
48*66d5ca2aSjeanPerier        typeInfo.getComponentInfo().getOps<fir::DTComponentOp>())
49*66d5ca2aSjeanPerier     if (componentInfo.getName() == component)
50*66d5ca2aSjeanPerier       return componentInfo.getLowerBounds();
51*66d5ca2aSjeanPerier   return std::nullopt;
52*66d5ca2aSjeanPerier }
53