@@ -1329,51 +1329,6 @@ llvm::Function *CGOpenMPRuntime::emitTaskOutlinedFunction(
1329
1329
return Res;
1330
1330
}
1331
1331
1332
- static void buildStructValue(ConstantStructBuilder &Fields, CodeGenModule &CGM,
1333
- const RecordDecl *RD, const CGRecordLayout &RL,
1334
- ArrayRef<llvm::Constant *> Data) {
1335
- llvm::StructType *StructTy = RL.getLLVMType();
1336
- unsigned PrevIdx = 0;
1337
- ConstantInitBuilder CIBuilder(CGM);
1338
- const auto *DI = Data.begin();
1339
- for (const FieldDecl *FD : RD->fields()) {
1340
- unsigned Idx = RL.getLLVMFieldNo(FD);
1341
- // Fill the alignment.
1342
- for (unsigned I = PrevIdx; I < Idx; ++I)
1343
- Fields.add(llvm::Constant::getNullValue(StructTy->getElementType(I)));
1344
- PrevIdx = Idx + 1;
1345
- Fields.add(*DI);
1346
- ++DI;
1347
- }
1348
- }
1349
-
1350
- template <class... As>
1351
- static llvm::GlobalVariable *
1352
- createGlobalStruct(CodeGenModule &CGM, QualType Ty, bool IsConstant,
1353
- ArrayRef<llvm::Constant *> Data, const Twine &Name,
1354
- As &&... Args) {
1355
- const auto *RD = cast<RecordDecl>(Ty->getAsTagDecl());
1356
- const CGRecordLayout &RL = CGM.getTypes().getCGRecordLayout(RD);
1357
- ConstantInitBuilder CIBuilder(CGM);
1358
- ConstantStructBuilder Fields = CIBuilder.beginStruct(RL.getLLVMType());
1359
- buildStructValue(Fields, CGM, RD, RL, Data);
1360
- return Fields.finishAndCreateGlobal(
1361
- Name, CGM.getContext().getAlignOfGlobalVarInChars(Ty), IsConstant,
1362
- std::forward<As>(Args)...);
1363
- }
1364
-
1365
- template <typename T>
1366
- static void
1367
- createConstantGlobalStructAndAddToParent(CodeGenModule &CGM, QualType Ty,
1368
- ArrayRef<llvm::Constant *> Data,
1369
- T &Parent) {
1370
- const auto *RD = cast<RecordDecl>(Ty->getAsTagDecl());
1371
- const CGRecordLayout &RL = CGM.getTypes().getCGRecordLayout(RD);
1372
- ConstantStructBuilder Fields = Parent.beginStruct(RL.getLLVMType());
1373
- buildStructValue(Fields, CGM, RD, RL, Data);
1374
- Fields.finishAndAddTo(Parent);
1375
- }
1376
-
1377
1332
void CGOpenMPRuntime::setLocThreadIdInsertPt(CodeGenFunction &CGF,
1378
1333
bool AtCurrentPoint) {
1379
1334
auto &Elem = OpenMPLocThreadIDMap.FindAndConstruct(CGF.CurFn);
@@ -3136,32 +3091,7 @@ void CGOpenMPRuntime::OffloadEntriesInfoManagerTy::
3136
3091
void CGOpenMPRuntime::createOffloadEntry(
3137
3092
llvm::Constant *ID, llvm::Constant *Addr, uint64_t Size, int32_t Flags,
3138
3093
llvm::GlobalValue::LinkageTypes Linkage) {
3139
- StringRef Name = Addr->getName();
3140
- llvm::Module &M = CGM.getModule();
3141
- llvm::LLVMContext &C = M.getContext();
3142
-
3143
- // Create constant string with the name.
3144
- llvm::Constant *StrPtrInit = llvm::ConstantDataArray::getString(C, Name);
3145
-
3146
- std::string StringName = getName({"omp_offloading", "entry_name"});
3147
- auto *Str = new llvm::GlobalVariable(
3148
- M, StrPtrInit->getType(), /*isConstant=*/true,
3149
- llvm::GlobalValue::InternalLinkage, StrPtrInit, StringName);
3150
- Str->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3151
-
3152
- llvm::Constant *Data[] = {
3153
- llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(ID, CGM.VoidPtrTy),
3154
- llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(Str, CGM.Int8PtrTy),
3155
- llvm::ConstantInt::get(CGM.SizeTy, Size),
3156
- llvm::ConstantInt::get(CGM.Int32Ty, Flags),
3157
- llvm::ConstantInt::get(CGM.Int32Ty, 0)};
3158
- std::string EntryName = getName({"omp_offloading", "entry", ""});
3159
- llvm::GlobalVariable *Entry = createGlobalStruct(
3160
- CGM, getTgtOffloadEntryQTy(), /*IsConstant=*/true, Data,
3161
- Twine(EntryName).concat(Name), llvm::GlobalValue::WeakAnyLinkage);
3162
-
3163
- // The entry has to be created in the section the linker expects it to be.
3164
- Entry->setSection("omp_offloading_entries");
3094
+ OMPBuilder.emitOffloadingEntry(ID, Addr->getName(), Size, Flags);
3165
3095
}
3166
3096
3167
3097
void CGOpenMPRuntime::createOffloadEntriesAndInfoMetadata() {
@@ -3426,35 +3356,6 @@ void CGOpenMPRuntime::emitKmpRoutineEntryT(QualType KmpInt32Ty) {
3426
3356
}
3427
3357
}
3428
3358
3429
- QualType CGOpenMPRuntime::getTgtOffloadEntryQTy() {
3430
- // Make sure the type of the entry is already created. This is the type we
3431
- // have to create:
3432
- // struct __tgt_offload_entry{
3433
- // void *addr; // Pointer to the offload entry info.
3434
- // // (function or global)
3435
- // char *name; // Name of the function or global.
3436
- // size_t size; // Size of the entry info (0 if it a function).
3437
- // int32_t flags; // Flags associated with the entry, e.g. 'link'.
3438
- // int32_t reserved; // Reserved, to use by the runtime library.
3439
- // };
3440
- if (TgtOffloadEntryQTy.isNull()) {
3441
- ASTContext &C = CGM.getContext();
3442
- RecordDecl *RD = C.buildImplicitRecord("__tgt_offload_entry");
3443
- RD->startDefinition();
3444
- addFieldToRecordDecl(C, RD, C.VoidPtrTy);
3445
- addFieldToRecordDecl(C, RD, C.getPointerType(C.CharTy));
3446
- addFieldToRecordDecl(C, RD, C.getSizeType());
3447
- addFieldToRecordDecl(
3448
- C, RD, C.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/true));
3449
- addFieldToRecordDecl(
3450
- C, RD, C.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/true));
3451
- RD->completeDefinition();
3452
- RD->addAttr(PackedAttr::CreateImplicit(C));
3453
- TgtOffloadEntryQTy = C.getRecordType(RD);
3454
- }
3455
- return TgtOffloadEntryQTy;
3456
- }
3457
-
3458
3359
namespace {
3459
3360
struct PrivateHelpersTy {
3460
3361
PrivateHelpersTy(const Expr *OriginalRef, const VarDecl *Original,
0 commit comments