2323// 2. Generalize this for more than just omp.target ops.
2424// ===----------------------------------------------------------------------===//
2525
26+ #include " flang/Optimizer/Builder/FIRBuilder.h"
2627#include " flang/Optimizer/Dialect/FIRType.h"
28+ #include " flang/Optimizer/Dialect/Support/KindMapping.h"
2729#include " flang/Optimizer/HLFIR/HLFIROps.h"
2830#include " flang/Optimizer/OpenMP/Passes.h"
2931#include " mlir/Dialect/Func/IR/FuncOps.h"
@@ -54,16 +56,29 @@ class MapsForPrivatizedSymbolsPass
5456 return false ;
5557 return true ;
5658 }
57- omp::MapInfoOp createMapInfo (Location loc, Value var, OpBuilder &builder) {
59+ omp::MapInfoOp createMapInfo (Location loc, Value var,
60+ fir::FirOpBuilder &builder) {
5861 uint64_t mapTypeTo = static_cast <
5962 std::underlying_type_t <llvm::omp::OpenMPOffloadMappingFlags>>(
6063 llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO);
6164 Operation *definingOp = var.getDefiningOp ();
6265 auto declOp = llvm::dyn_cast_or_null<hlfir::DeclareOp>(definingOp);
6366 assert (declOp &&
6467 " Expected defining Op of privatized var to be hlfir.declare" );
65- Value varPtr = declOp.getOriginalBase ();
68+ Value varPtr = declOp.getBase ();
6669
70+ if (mlir::isa<fir::BaseBoxType>(varPtr.getType ()) ||
71+ mlir::isa<fir::BoxCharType>(varPtr.getType ())) {
72+ llvm::errs () << " Is a basebox type\n " ;
73+ OpBuilder::InsertPoint savedInsPoint = builder.saveInsertionPoint ();
74+ mlir::Block *allocaBlock = builder.getAllocaBlock ();
75+ assert (allocaBlock && " No allocablock found for a funcOp" );
76+ builder.setInsertionPointToStart (allocaBlock);
77+ auto alloca = builder.create <fir::AllocaOp>(loc, varPtr.getType ());
78+ builder.restoreInsertionPoint (savedInsPoint);
79+ builder.create <fir::StoreOp>(loc, varPtr, alloca);
80+ varPtr = alloca;
81+ }
6782 return builder.create <omp::MapInfoOp>(
6883 loc, varPtr.getType (), varPtr,
6984 TypeAttr::get (llvm::cast<omp::PointerLikeType>(varPtr.getType ())
@@ -91,10 +106,12 @@ class MapsForPrivatizedSymbolsPass
91106 addMapInfoOp (targetOp, mapInfoOp);
92107 }
93108 void runOnOperation () override {
94- MLIRContext *context = &getContext ();
95- OpBuilder builder (context);
109+ ModuleOp module = getOperation ()->getParentOfType <ModuleOp>();
110+ fir::KindMapping kindMap = fir::getKindMapping (module );
111+ fir::FirOpBuilder builder{module , std::move (kindMap)};
96112 llvm::DenseMap<Operation *, llvm::SmallVector<omp::MapInfoOp, 4 >>
97113 mapInfoOpsForTarget;
114+
98115 getOperation ()->walk ([&](omp::TargetOp targetOp) {
99116 if (targetOp.getPrivateVars ().empty ())
100117 return ;
@@ -112,7 +129,9 @@ class MapsForPrivatizedSymbolsPass
112129 }
113130 builder.setInsertionPoint (targetOp);
114131 Location loc = targetOp.getLoc ();
132+ llvm::errs () << " Here\n " ;
115133 omp::MapInfoOp mapInfoOp = createMapInfo (loc, privVar, builder);
134+ llvm::errs () << " Here again\n " ;
116135 mapInfoOps.push_back (mapInfoOp);
117136 LLVM_DEBUG (llvm::dbgs () << " MapsForPrivatizedSymbolsPass created ->\n " );
118137 LLVM_DEBUG (mapInfoOp.dump ());
0 commit comments