https://github.com/junlarsen updated https://github.com/llvm/llvm-project/pull/124771
>From 13d65a0cc95fe53f959db343e5be07773ee53f28 Mon Sep 17 00:00:00 2001 From: Mats Jun Larsen <mats@jun.codes> Date: Wed, 29 Jan 2025 00:31:32 +0900 Subject: [PATCH 1/5] [CodeGen] Replace of PointerType::get(Type) with opaque version (NFC) Follow-up to https://github.com/llvm/llvm-project/issues/123569 --- clang/lib/CodeGen/Address.h | 8 ++++---- clang/lib/CodeGen/CGBlocks.cpp | 23 +---------------------- clang/lib/CodeGen/CGDecl.cpp | 5 +---- clang/lib/CodeGen/CGDeclCXX.cpp | 4 ++-- clang/lib/CodeGen/CGExpr.cpp | 4 ++-- clang/lib/CodeGen/CGObjCMac.cpp | 2 +- clang/lib/CodeGen/CodeGenModule.cpp | 6 +++--- 7 files changed, 14 insertions(+), 38 deletions(-) diff --git a/clang/lib/CodeGen/Address.h b/clang/lib/CodeGen/Address.h index a18c7169af1eb96..852aa0e686fe3c6 100644 --- a/clang/lib/CodeGen/Address.h +++ b/clang/lib/CodeGen/Address.h @@ -19,6 +19,7 @@ #include "clang/AST/Type.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/IR/Constants.h" +#include "llvm/IR/DerivedTypes.h" #include "llvm/Support/MathExtras.h" namespace clang { @@ -197,10 +198,9 @@ class Address { /// Return the type of the pointer value. llvm::PointerType *getType() const { - return llvm::PointerType::get( - ElementType, - llvm::cast<llvm::PointerType>(Pointer.getPointer()->getType()) - ->getAddressSpace()); + auto AS = llvm::cast<llvm::PointerType>(Pointer.getPointer()->getType()) + ->getAddressSpace(); + return llvm::PointerType::get(ElementType->getContext(), AS); } /// Return the type of the values stored in this address. diff --git a/clang/lib/CodeGen/CGBlocks.cpp b/clang/lib/CodeGen/CGBlocks.cpp index aaba354c08547d4..faef6a5fbe1f5b6 100644 --- a/clang/lib/CodeGen/CGBlocks.cpp +++ b/clang/lib/CodeGen/CGBlocks.cpp @@ -1097,31 +1097,10 @@ llvm::Type *CodeGenModule::getBlockDescriptorType() { if (BlockDescriptorType) return BlockDescriptorType; - llvm::Type *UnsignedLongTy = - getTypes().ConvertType(getContext().UnsignedLongTy); - - // struct __block_descriptor { - // unsigned long reserved; - // unsigned long block_size; - // - // // later, the following will be added - // - // struct { - // void (*copyHelper)(); - // void (*copyHelper)(); - // } helpers; // !!! optional - // - // const char *signature; // the block signature - // const char *layout; // reserved - // }; - BlockDescriptorType = llvm::StructType::create( - "struct.__block_descriptor", UnsignedLongTy, UnsignedLongTy); - - // Now form a pointer to that. unsigned AddrSpace = 0; if (getLangOpts().OpenCL) AddrSpace = getContext().getTargetAddressSpace(LangAS::opencl_constant); - BlockDescriptorType = llvm::PointerType::get(BlockDescriptorType, AddrSpace); + BlockDescriptorType = llvm::PointerType::get(getLLVMContext(), AddrSpace); return BlockDescriptorType; } diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index cc6815db4d20f62..572175d9969a097 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -2870,15 +2870,12 @@ void CodeGenModule::EmitOMPAllocateDecl(const OMPAllocateDecl *D) { // We can also keep the existing global if the address space is what we // expect it to be, if not, it is replaced. - QualType ASTTy = VD->getType(); clang::LangAS GVAS = GetGlobalVarAddressSpace(VD); auto TargetAS = getContext().getTargetAddressSpace(GVAS); if (Entry->getType()->getAddressSpace() == TargetAS) continue; - // Make a new global with the correct type / address space. - llvm::Type *Ty = getTypes().ConvertTypeForMem(ASTTy); - llvm::PointerType *PTy = llvm::PointerType::get(Ty, TargetAS); + llvm::PointerType *PTy = llvm::PointerType::get(getLLVMContext(), TargetAS); // Replace all uses of the old global with a cast. Since we mutate the type // in place we neeed an intermediate that takes the spot of the old entry diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 1c2fecea1a6ac25..5005f6b3cbd2d1a 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -347,7 +347,7 @@ void CodeGenFunction::registerGlobalDtorWithAtExit(llvm::Constant *dtorStub) { // extern "C" int atexit(void (*f)(void)); assert(dtorStub->getType() == llvm::PointerType::get( - llvm::FunctionType::get(CGM.VoidTy, false), + CGM.getLLVMContext(), dtorStub->getType()->getPointerAddressSpace()) && "Argument to atexit has a wrong type."); @@ -374,7 +374,7 @@ CodeGenFunction::unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub) { // extern "C" int unatexit(void (*f)(void)); assert(dtorStub->getType() == llvm::PointerType::get( - llvm::FunctionType::get(CGM.VoidTy, false), + CGM.getLLVMContext(), dtorStub->getType()->getPointerAddressSpace()) && "Argument to unatexit has a wrong type."); diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index bf8df2789f58dba..d95f09791457a05 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/lib/CodeGen/CGExpr.cpp @@ -872,7 +872,7 @@ void CodeGenFunction::EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, llvm::Value *TypeHash = llvm::ConstantInt::get(Int64Ty, xxh3_64bits(Out.str())); - llvm::Type *VPtrTy = llvm::PointerType::get(IntPtrTy, 0); + llvm::Type *VPtrTy = llvm::PointerType::get(getLLVMContext(), 0); Address VPtrAddr(Ptr, IntPtrTy, getPointerAlign()); llvm::Value *VPtrVal = GetVTablePtr(VPtrAddr, VPtrTy, Ty->getAsCXXRecordDecl(), @@ -3054,7 +3054,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) { getContext().getDeclAlign(VD)); llvm::Type *VarTy = getTypes().ConvertTypeForMem(VD->getType()); auto *PTy = llvm::PointerType::get( - VarTy, getTypes().getTargetAddressSpace(VD->getType())); + getLLVMContext(), getTypes().getTargetAddressSpace(VD->getType())); Addr = Builder.CreatePointerBitCastOrAddrSpaceCast(Addr, PTy, VarTy); } else { // Should we be using the alignment of the constant pointer we emitted? diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp index dd900f9b32fb78e..6c929a6431c0f06 100644 --- a/clang/lib/CodeGen/CGObjCMac.cpp +++ b/clang/lib/CodeGen/CGObjCMac.cpp @@ -5717,7 +5717,7 @@ ObjCCommonTypesHelper::ObjCCommonTypesHelper(CodeGen::CodeGenModule &cgm) IntTy = CGM.IntTy; LongTy = cast<llvm::IntegerType>(Types.ConvertType(Ctx.LongTy)); Int8PtrTy = CGM.Int8PtrTy; - Int8PtrProgramASTy = llvm::PointerType::get(CGM.Int8Ty, ProgramAS); + Int8PtrProgramASTy = llvm::PointerType::get(CGM.getLLVMContext(), ProgramAS); Int8PtrPtrTy = CGM.Int8PtrPtrTy; // arm64 targets use "int" ivar offset variables. All others, diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 47c03ea5e72cba7..c056d103a7fe4f3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -4432,7 +4432,7 @@ void CodeGenModule::emitCPUDispatchDefinition(GlobalDecl GD) { GlobalDecl ResolverGD; if (getTarget().supportsIFunc()) { ResolverType = llvm::FunctionType::get( - llvm::PointerType::get(DeclTy, + llvm::PointerType::get(getLLVMContext(), getTypes().getTargetAddressSpace(FD->getType())), false); } @@ -4604,8 +4604,8 @@ llvm::Constant *CodeGenModule::GetOrCreateMultiVersionResolver(GlobalDecl GD) { // cpu_dispatch will be emitted in this translation unit. if (ShouldReturnIFunc) { unsigned AS = getTypes().getTargetAddressSpace(FD->getType()); - llvm::Type *ResolverType = - llvm::FunctionType::get(llvm::PointerType::get(DeclTy, AS), false); + llvm::Type *ResolverType = llvm::FunctionType::get( + llvm::PointerType::get(getLLVMContext(), AS), false); llvm::Constant *Resolver = GetOrCreateLLVMFunction( MangledName + ".resolver", ResolverType, GlobalDecl{}, /*ForVTable=*/false); >From 9a21d425bf6888e530f5054bc980e41757791cde Mon Sep 17 00:00:00 2001 From: Mats Jun Larsen <mats@jun.codes> Date: Sat, 8 Feb 2025 01:45:00 +0900 Subject: [PATCH 2/5] Remove unnecessary pointer bitcast --- clang/lib/CodeGen/CGDecl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 572175d9969a097..80a849fd5298282 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -2888,7 +2888,7 @@ void CodeGenModule::EmitOMPAllocateDecl(const OMPAllocateDecl *D) { Entry->mutateType(PTy); llvm::Constant *NewPtrForOldDecl = - llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast( + llvm::ConstantExpr::getAddrSpaceCast( Entry, DummyGV->getType()); // Now we have a casted version of the changed global, the dummy can be >From ff0399f25b53453ebcc9a15f14ef98c733d87756 Mon Sep 17 00:00:00 2001 From: Mats Jun Larsen <mats@jun.codes> Date: Sat, 8 Feb 2025 01:54:43 +0900 Subject: [PATCH 3/5] Run clang format --- clang/lib/CodeGen/CGDecl.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp index 80a849fd5298282..668282a6ab1a88f 100644 --- a/clang/lib/CodeGen/CGDecl.cpp +++ b/clang/lib/CodeGen/CGDecl.cpp @@ -2888,8 +2888,7 @@ void CodeGenModule::EmitOMPAllocateDecl(const OMPAllocateDecl *D) { Entry->mutateType(PTy); llvm::Constant *NewPtrForOldDecl = - llvm::ConstantExpr::getAddrSpaceCast( - Entry, DummyGV->getType()); + llvm::ConstantExpr::getAddrSpaceCast(Entry, DummyGV->getType()); // Now we have a casted version of the changed global, the dummy can be // replaced and deleted. >From 3dbdefb0caffe32360493224892a7e3e0ca0afb0 Mon Sep 17 00:00:00 2001 From: Mats Jun Larsen <mats@jun.codes> Date: Sat, 8 Feb 2025 22:37:41 +0900 Subject: [PATCH 4/5] Cast directly and simplify assertions --- clang/lib/CodeGen/Address.h | 5 ++--- clang/lib/CodeGen/CGDeclCXX.cpp | 10 ++-------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/clang/lib/CodeGen/Address.h b/clang/lib/CodeGen/Address.h index 852aa0e686fe3c6..93965fcfa33f359 100644 --- a/clang/lib/CodeGen/Address.h +++ b/clang/lib/CodeGen/Address.h @@ -20,6 +20,7 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" +#include "llvm/Support/Casting.h" #include "llvm/Support/MathExtras.h" namespace clang { @@ -198,9 +199,7 @@ class Address { /// Return the type of the pointer value. llvm::PointerType *getType() const { - auto AS = llvm::cast<llvm::PointerType>(Pointer.getPointer()->getType()) - ->getAddressSpace(); - return llvm::PointerType::get(ElementType->getContext(), AS); + return llvm::cast<llvm::PointerType>(Pointer.getPointer()->getType()); } /// Return the type of the values stored in this address. diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 5005f6b3cbd2d1a..f5950f03673a12b 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -345,10 +345,7 @@ void CodeGenFunction::registerGlobalDtorWithLLVM(const VarDecl &VD, void CodeGenFunction::registerGlobalDtorWithAtExit(llvm::Constant *dtorStub) { // extern "C" int atexit(void (*f)(void)); - assert(dtorStub->getType() == - llvm::PointerType::get( - CGM.getLLVMContext(), - dtorStub->getType()->getPointerAddressSpace()) && + assert(dtorStub->getType()->isPointerTy() && "Argument to atexit has a wrong type."); llvm::FunctionType *atexitTy = @@ -372,10 +369,7 @@ CodeGenFunction::unregisterGlobalDtorWithUnAtExit(llvm::Constant *dtorStub) { // value is returned. // // extern "C" int unatexit(void (*f)(void)); - assert(dtorStub->getType() == - llvm::PointerType::get( - CGM.getLLVMContext(), - dtorStub->getType()->getPointerAddressSpace()) && + assert(dtorStub->getType()->isPointerTy() && "Argument to unatexit has a wrong type."); llvm::FunctionType *unatexitTy = >From adf2362c3a38ef6637195e15ed7269eec948f3d2 Mon Sep 17 00:00:00 2001 From: Mats Jun Larsen <mats@jun.codes> Date: Sat, 8 Feb 2025 23:55:22 +0900 Subject: [PATCH 5/5] Remove inserted includes --- clang/lib/CodeGen/Address.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/clang/lib/CodeGen/Address.h b/clang/lib/CodeGen/Address.h index 93965fcfa33f359..a748ddaa110a5bd 100644 --- a/clang/lib/CodeGen/Address.h +++ b/clang/lib/CodeGen/Address.h @@ -19,8 +19,6 @@ #include "clang/AST/Type.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/IR/Constants.h" -#include "llvm/IR/DerivedTypes.h" -#include "llvm/Support/Casting.h" #include "llvm/Support/MathExtras.h" namespace clang { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits