[clang] 63f8226 - [OpenMPIRBuilder] Add createOffloadMaptypes and createOffloadMapnames functions
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 3 12:42:39 PDT 2021
Author: Valentin Clement
Date: 2021-05-03T15:42:32-04:00
New Revision: 63f8226f259a03d7a56403be496724b77314e19a
URL: https://github.com/llvm/llvm-project/commit/63f8226f259a03d7a56403be496724b77314e19a
DIFF: https://github.com/llvm/llvm-project/commit/63f8226f259a03d7a56403be496724b77314e19a.diff
LOG: [OpenMPIRBuilder] Add createOffloadMaptypes and createOffloadMapnames functions
Add function to create the offload_maptypes and the offload_mapnames globals. These two functions
are used in clang. They will be used in the Flang/MLIR lowering as well.
Reviewed By: Meinersbur
Differential Revision: https://reviews.llvm.org/D101503
Added:
Modified:
clang/lib/CodeGen/CGOpenMPRuntime.cpp
llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 1980c5c91af20..38da679ca79d6 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -9378,15 +9378,10 @@ static void emitOffloadingArrays(
// fill arrays. Instead, we create an array constant.
SmallVector<uint64_t, 4> Mapping(CombinedInfo.Types.size(), 0);
llvm::copy(CombinedInfo.Types, Mapping.begin());
- llvm::Constant *MapTypesArrayInit =
- llvm::ConstantDataArray::get(CGF.Builder.getContext(), Mapping);
std::string MaptypesName =
CGM.getOpenMPRuntime().getName({"offload_maptypes"});
- auto *MapTypesArrayGbl = new llvm::GlobalVariable(
- CGM.getModule(), MapTypesArrayInit->getType(),
- /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage,
- MapTypesArrayInit, MaptypesName);
- MapTypesArrayGbl->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
+ auto *MapTypesArrayGbl =
+ OMPBuilder.createOffloadMaptypes(Mapping, MaptypesName);
Info.MapTypesArray = MapTypesArrayGbl;
// The information types are only built if there is debug information
@@ -9400,17 +9395,10 @@ static void emitOffloadingArrays(
};
SmallVector<llvm::Constant *, 4> InfoMap(CombinedInfo.Exprs.size());
llvm::transform(CombinedInfo.Exprs, InfoMap.begin(), fillInfoMap);
-
- llvm::Constant *MapNamesArrayInit = llvm::ConstantArray::get(
- llvm::ArrayType::get(
- llvm::Type::getInt8Ty(CGF.Builder.getContext())->getPointerTo(),
- CombinedInfo.Exprs.size()),
- InfoMap);
- auto *MapNamesArrayGbl = new llvm::GlobalVariable(
- CGM.getModule(), MapNamesArrayInit->getType(),
- /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage,
- MapNamesArrayInit,
- CGM.getOpenMPRuntime().getName({"offload_mapnames"}));
+ std::string MapnamesName =
+ CGM.getOpenMPRuntime().getName({"offload_mapnames"});
+ auto *MapNamesArrayGbl =
+ OMPBuilder.createOffloadMapnames(InfoMap, MapnamesName);
Info.MapNamesArray = MapNamesArrayGbl;
}
@@ -9425,15 +9413,8 @@ static void emitOffloadingArrays(
}
}
if (EndMapTypesDiffer) {
- MapTypesArrayInit =
- llvm::ConstantDataArray::get(CGF.Builder.getContext(), Mapping);
- MaptypesName = CGM.getOpenMPRuntime().getName({"offload_maptypes"});
- MapTypesArrayGbl = new llvm::GlobalVariable(
- CGM.getModule(), MapTypesArrayInit->getType(),
- /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage,
- MapTypesArrayInit, MaptypesName);
- MapTypesArrayGbl->setUnnamedAddr(
- llvm::GlobalValue::UnnamedAddr::Global);
+ MapTypesArrayGbl =
+ OMPBuilder.createOffloadMaptypes(Mapping, MaptypesName);
Info.MapTypesArrayEnd = MapTypesArrayGbl;
}
}
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index 4b8f4e7a597e5..a117dbf14fd69 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -623,6 +623,15 @@ class OpenMPIRBuilder {
/// variables.
StringMap<AssertingVH<Constant>, BumpPtrAllocator> InternalVars;
+ /// Create the global variable holding the offload mappings information.
+ GlobalVariable *createOffloadMaptypes(SmallVectorImpl<uint64_t> &Mappings,
+ std::string VarName);
+
+ /// Create the global variable holding the offload names information.
+ GlobalVariable *
+ createOffloadMapnames(SmallVectorImpl<llvm::Constant *> &Names,
+ std::string VarName);
+
public:
/// Generator for __kmpc_copyprivate
///
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index aff38fa47b285..ac97d080367ea 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -2229,6 +2229,33 @@ Value *OpenMPIRBuilder::getOMPCriticalRegionLock(StringRef CriticalName) {
return getOrCreateOMPInternalVariable(KmpCriticalNameTy, Name);
}
+GlobalVariable *
+OpenMPIRBuilder::createOffloadMaptypes(SmallVectorImpl<uint64_t> &Mappings,
+ std::string VarName) {
+ llvm::Constant *MaptypesArrayInit =
+ llvm::ConstantDataArray::get(M.getContext(), Mappings);
+ auto *MaptypesArrayGlobal = new llvm::GlobalVariable(
+ M, MaptypesArrayInit->getType(),
+ /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage, MaptypesArrayInit,
+ VarName);
+ MaptypesArrayGlobal->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
+ return MaptypesArrayGlobal;
+}
+
+GlobalVariable *
+OpenMPIRBuilder::createOffloadMapnames(SmallVectorImpl<llvm::Constant *> &Names,
+ std::string VarName) {
+ llvm::Constant *MapNamesArrayInit = llvm::ConstantArray::get(
+ llvm::ArrayType::get(
+ llvm::Type::getInt8Ty(M.getContext())->getPointerTo(), Names.size()),
+ Names);
+ auto *MapNamesArrayGlobal = new llvm::GlobalVariable(
+ M, MapNamesArrayInit->getType(),
+ /*isConstant=*/true, llvm::GlobalValue::PrivateLinkage, MapNamesArrayInit,
+ VarName);
+ return MapNamesArrayGlobal;
+}
+
// Create all simple and struct types exposed by the runtime and remember
// the llvm::PointerTypes of them for easy access later.
void OpenMPIRBuilder::initializeTypes(Module &M) {
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index 8da58d57a9734..01fe6ada2fc6d 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -2287,4 +2287,68 @@ TEST_F(OpenMPIRBuilderTest, CreateSections) {
ASSERT_EQ(NumFiniCBCalls, 1U);
}
+TEST_F(OpenMPIRBuilderTest, CreateOffloadMaptypes) {
+ OpenMPIRBuilder OMPBuilder(*M);
+ OMPBuilder.initialize();
+
+ IRBuilder<> Builder(BB);
+
+ SmallVector<uint64_t> Mappings = {0, 1};
+ GlobalVariable *OffloadMaptypesGlobal =
+ OMPBuilder.createOffloadMaptypes(Mappings, "offload_maptypes");
+ EXPECT_FALSE(M->global_empty());
+ EXPECT_EQ(OffloadMaptypesGlobal->getName(), "offload_maptypes");
+ EXPECT_TRUE(OffloadMaptypesGlobal->isConstant());
+ EXPECT_TRUE(OffloadMaptypesGlobal->hasGlobalUnnamedAddr());
+ EXPECT_TRUE(OffloadMaptypesGlobal->hasPrivateLinkage());
+ EXPECT_TRUE(OffloadMaptypesGlobal->hasInitializer());
+ Constant *Initializer = OffloadMaptypesGlobal->getInitializer();
+ EXPECT_TRUE(isa<ConstantDataArray>(Initializer));
+ ConstantDataArray *MappingInit = dyn_cast<ConstantDataArray>(Initializer);
+ EXPECT_EQ(MappingInit->getNumElements(), Mappings.size());
+ EXPECT_TRUE(MappingInit->getType()->getElementType()->isIntegerTy(64));
+ Constant *CA = ConstantDataArray::get(Builder.getContext(), Mappings);
+ EXPECT_EQ(MappingInit, CA);
+}
+
+TEST_F(OpenMPIRBuilderTest, CreateOffloadMapnames) {
+ OpenMPIRBuilder OMPBuilder(*M);
+ OMPBuilder.initialize();
+
+ IRBuilder<> Builder(BB);
+
+ Constant *Cst1 = OMPBuilder.getOrCreateSrcLocStr("array1", "file1", 2, 5);
+ Constant *Cst2 = OMPBuilder.getOrCreateSrcLocStr("array2", "file1", 3, 5);
+ SmallVector<llvm::Constant *> Names = {Cst1, Cst2};
+
+ GlobalVariable *OffloadMaptypesGlobal =
+ OMPBuilder.createOffloadMapnames(Names, "offload_mapnames");
+ EXPECT_FALSE(M->global_empty());
+ EXPECT_EQ(OffloadMaptypesGlobal->getName(), "offload_mapnames");
+ EXPECT_TRUE(OffloadMaptypesGlobal->isConstant());
+ EXPECT_FALSE(OffloadMaptypesGlobal->hasGlobalUnnamedAddr());
+ EXPECT_TRUE(OffloadMaptypesGlobal->hasPrivateLinkage());
+ EXPECT_TRUE(OffloadMaptypesGlobal->hasInitializer());
+ Constant *Initializer = OffloadMaptypesGlobal->getInitializer();
+ EXPECT_TRUE(isa<Constant>(Initializer->getOperand(0)->stripPointerCasts()));
+ EXPECT_TRUE(isa<Constant>(Initializer->getOperand(1)->stripPointerCasts()));
+
+ GlobalVariable *Name1Gbl =
+ cast<GlobalVariable>(Initializer->getOperand(0)->stripPointerCasts());
+ EXPECT_TRUE(isa<ConstantDataArray>(Name1Gbl->getInitializer()));
+ ConstantDataArray *Name1GblCA =
+ dyn_cast<ConstantDataArray>(Name1Gbl->getInitializer());
+ EXPECT_EQ(Name1GblCA->getAsCString(), ";file1;array1;2;5;;");
+
+ GlobalVariable *Name2Gbl =
+ cast<GlobalVariable>(Initializer->getOperand(1)->stripPointerCasts());
+ EXPECT_TRUE(isa<ConstantDataArray>(Name2Gbl->getInitializer()));
+ ConstantDataArray *Name2GblCA =
+ dyn_cast<ConstantDataArray>(Name2Gbl->getInitializer());
+ EXPECT_EQ(Name2GblCA->getAsCString(), ";file1;array2;3;5;;");
+
+ EXPECT_TRUE(Initializer->getType()->getArrayElementType()->isPointerTy());
+ EXPECT_EQ(Initializer->getType()->getArrayNumElements(), Names.size());
+}
+
} // namespace
More information about the cfe-commits
mailing list