yaxunl updated this revision to Diff 89834. yaxunl retitled this revision from "Allow target to specify default address space for codegen" to "[WIP] Specify default address space for C++ on AMDGPU Target". yaxunl added a comment. Herald added subscribers: tpr, dstuttard, kzhuravl.
Synch up to trunk. Change bitcast to pointer cast in varous places to accommodation addr space difference. https://reviews.llvm.org/D27627 Files: include/clang/AST/ASTContext.h include/clang/Basic/TargetInfo.h lib/AST/ASTContext.cpp lib/Basic/Targets.cpp lib/CodeGen/CGBuiltin.cpp lib/CodeGen/CGCall.cpp lib/CodeGen/CGDecl.cpp lib/CodeGen/CGDeclCXX.cpp lib/CodeGen/CGException.cpp lib/CodeGen/CGExpr.cpp lib/CodeGen/CGExprConstant.cpp lib/CodeGen/CGOpenMPRuntime.cpp lib/CodeGen/CGVTT.cpp lib/CodeGen/CGVTables.cpp lib/CodeGen/CodeGenFunction.cpp lib/CodeGen/CodeGenFunction.h lib/CodeGen/CodeGenModule.cpp lib/CodeGen/ItaniumCXXABI.cpp
Index: lib/CodeGen/ItaniumCXXABI.cpp =================================================================== --- lib/CodeGen/ItaniumCXXABI.cpp +++ lib/CodeGen/ItaniumCXXABI.cpp @@ -1108,7 +1108,7 @@ if (!Record->hasTrivialDestructor()) { CXXDestructorDecl *DtorD = Record->getDestructor(); Dtor = CGM.getAddrOfCXXStructor(DtorD, StructorType::Complete); - Dtor = llvm::ConstantExpr::getBitCast(Dtor, CGM.Int8PtrTy); + Dtor = llvm::ConstantExpr::getPointerCast(Dtor, CGM.Int8PtrTy); } } if (!Dtor) Dtor = llvm::Constant::getNullValue(CGM.Int8PtrTy); @@ -2171,7 +2171,7 @@ llvm::Value *args[] = { llvm::ConstantExpr::getBitCast(dtor, dtorTy), - llvm::ConstantExpr::getBitCast(addr, CGF.Int8PtrTy), + llvm::ConstantExpr::getPointerCast(addr, CGF.Int8PtrTy), handle }; CGF.EmitNounwindRuntimeCall(atexit, args); @@ -2584,7 +2584,7 @@ } } - return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); + return llvm::ConstantExpr::getPointerCast(GV, CGM.Int8PtrTy); } /// TypeInfoIsInStandardLibrary - Given a builtin type, returns whether the type @@ -2913,7 +2913,7 @@ llvm::Constant *Two = llvm::ConstantInt::get(PtrDiffTy, 2); VTable = llvm::ConstantExpr::getInBoundsGetElementPtr(CGM.Int8PtrTy, VTable, Two); - VTable = llvm::ConstantExpr::getBitCast(VTable, CGM.Int8PtrTy); + VTable = llvm::ConstantExpr::getPointerCast(VTable, CGM.Int8PtrTy); Fields.push_back(VTable); } @@ -2986,7 +2986,7 @@ assert(!OldGV->hasAvailableExternallyLinkage() && "available_externally typeinfos not yet implemented"); - return llvm::ConstantExpr::getBitCast(OldGV, CGM.Int8PtrTy); + return llvm::ConstantExpr::getPointerCast(OldGV, CGM.Int8PtrTy); } // Check if there is already an external RTTI descriptor for this type. @@ -3022,7 +3022,7 @@ TypeNameField = llvm::ConstantExpr::getIntToPtr(TypeNameField, CGM.Int8PtrTy); } else { - TypeNameField = llvm::ConstantExpr::getBitCast(TypeName, CGM.Int8PtrTy); + TypeNameField = llvm::ConstantExpr::getPointerCast(TypeName, CGM.Int8PtrTy); } Fields.push_back(TypeNameField); @@ -3177,7 +3177,7 @@ } } - return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy); + return llvm::ConstantExpr::getPointerCast(GV, CGM.Int8PtrTy); } /// BuildObjCObjectTypeInfo - Build the appropriate kind of type_info Index: lib/CodeGen/CodeGenModule.cpp =================================================================== --- lib/CodeGen/CodeGenModule.cpp +++ lib/CodeGen/CodeGenModule.cpp @@ -47,6 +47,7 @@ #include "llvm/ADT/Triple.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/CallingConv.h" +#include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/LLVMContext.h" @@ -750,7 +751,7 @@ ctor.addInt(Int32Ty, I.Priority); ctor.add(llvm::ConstantExpr::getBitCast(I.Initializer, CtorPFTy)); if (I.AssociatedData) - ctor.add(llvm::ConstantExpr::getBitCast(I.AssociatedData, VoidPtrTy)); + ctor.add(llvm::ConstantExpr::getPointerCast(I.AssociatedData, VoidPtrTy)); else ctor.addNullPointer(VoidPtrTy); ctor.finishAndAddTo(ctors); @@ -1418,10 +1419,13 @@ *LineNoCst = EmitAnnotationLineNo(L); // Create the ConstantStruct for the global annotation. + unsigned AS = GV->getType()->getAddressSpace(); + llvm::PointerType *I8PTy = (AS == Int8PtrTy->getAddressSpace()) ? + Int8PtrTy : Int8Ty->getPointerTo(AS); llvm::Constant *Fields[4] = { - llvm::ConstantExpr::getBitCast(GV, Int8PtrTy), - llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy), - llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy), + llvm::ConstantExpr::getPointerCast(GV, I8PTy), + llvm::ConstantExpr::getPointerCast(AnnoGV, I8PTy), + llvm::ConstantExpr::getPointerCast(UnitGV, I8PTy), LineNoCst }; return llvm::ConstantStruct::getAnon(Fields); @@ -1548,7 +1552,7 @@ llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee()); if (Entry) { unsigned AS = getContext().getTargetAddressSpace(VD->getType()); - auto Ptr = llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS)); + auto Ptr = llvm::ConstantExpr::getPointerCast(Entry, DeclTy->getPointerTo(AS)); return ConstantAddress(Ptr, Alignment); } @@ -2237,10 +2241,6 @@ } } - // Make sure the result is of the correct type. - if (Entry->getType()->getAddressSpace() != Ty->getAddressSpace()) - return llvm::ConstantExpr::getAddrSpaceCast(Entry, Ty); - // (If global is requested for a definition, we always need to create a new // global, not just return a bitcast.) if (!IsForDefinition) @@ -2260,7 +2260,7 @@ if (!Entry->use_empty()) { llvm::Constant *NewPtrForOldDecl = - llvm::ConstantExpr::getBitCast(GV, Entry->getType()); + llvm::ConstantExpr::getPointerCast(GV, Entry->getType()); Entry->replaceAllUsesWith(NewPtrForOldDecl); } @@ -2372,7 +2372,7 @@ if (!OldGV->use_empty()) { llvm::Constant *NewPtrForOldDecl = - llvm::ConstantExpr::getBitCast(GV, OldGV->getType()); + llvm::ConstantExpr::getPointerCast(GV, OldGV->getType()); OldGV->replaceAllUsesWith(NewPtrForOldDecl); } @@ -2621,7 +2621,7 @@ // Replace all uses of the old global with the new global llvm::Constant *NewPtrForOldDecl = - llvm::ConstantExpr::getBitCast(GV, Entry->getType()); + llvm::ConstantExpr::getPointerCast(GV, Entry->getType()); Entry->replaceAllUsesWith(NewPtrForOldDecl); // Erase the old global, since it is no longer used. @@ -3116,7 +3116,7 @@ // Remove it and replace uses of it with the alias. GA->takeName(Entry); - Entry->replaceAllUsesWith(llvm::ConstantExpr::getBitCast(GA, + Entry->replaceAllUsesWith(llvm::ConstantExpr::getPointerCast(GA, Entry->getType())); Entry->eraseFromParent(); } else { @@ -3334,7 +3334,7 @@ if (isUTF16) // Cast the UTF16 string to the correct type. - Str = llvm::ConstantExpr::getBitCast(Str, Int8PtrTy); + Str = llvm::ConstantExpr::getPointerCast(Str, Int8PtrTy); Fields.add(Str); // String length. Index: lib/CodeGen/CodeGenFunction.h =================================================================== --- lib/CodeGen/CodeGenFunction.h +++ lib/CodeGen/CodeGenFunction.h @@ -377,7 +377,7 @@ }; /// i32s containing the indexes of the cleanup destinations. - llvm::AllocaInst *NormalCleanupDest; + llvm::Instruction *NormalCleanupDest; unsigned NextCleanupDestIndex; @@ -392,8 +392,8 @@ llvm::Value *ExceptionSlot; /// The selector slot. Under the MandatoryCleanup model, all landing pads - /// write the current selector value into this alloca. - llvm::AllocaInst *EHSelectorSlot; + /// write the current selector value into this instruction. + llvm::Instruction *EHSelectorSlot; /// A stack of exception code slots. Entering an __except block pushes a slot /// on the stack and leaving pops one. The __exception_code() intrinsic loads @@ -428,11 +428,11 @@ /// An i1 variable indicating whether or not the @finally is /// running for an exception. - llvm::AllocaInst *ForEHVar; + llvm::Instruction *ForEHVar; /// An i8* variable into which the exception pointer to rethrow /// has been saved. - llvm::AllocaInst *SavedExnVar; + llvm::Instruction *SavedExnVar; public: void enter(CodeGenFunction &CGF, const Stmt *Finally, @@ -1858,14 +1858,23 @@ AlignmentSource *Source = nullptr); LValue EmitLoadOfPointerLValue(Address Ptr, const PointerType *PtrTy); + /// Create an alloca instruction. If the default address space is not 0, + /// insert addrspacecast instruction which casts the alloca instruction + /// to the default address space. + llvm::Instruction *CreateAlloca(llvm::Type *Ty, const Twine &Name = "tmp", + llvm::Instruction *InsertPos = nullptr); /// CreateTempAlloca - This creates a alloca and inserts it into the entry /// block. The caller is responsible for setting an appropriate alignment on - /// the alloca. - llvm::AllocaInst *CreateTempAlloca(llvm::Type *Ty, - const Twine &Name = "tmp"); + /// the alloca. If the default address space is not 0, insert addrspacecast. + llvm::Instruction *CreateTempAlloca(llvm::Type *Ty, + const Twine &Name = "tmp"); Address CreateTempAlloca(llvm::Type *Ty, CharUnits align, const Twine &Name = "tmp"); + /// Get alloca instruction operand of an addrspacecast instruction. + /// If \p Inst is alloca instruction, returns \p Inst; + llvm::AllocaInst *getAddrSpaceCastedAlloca(llvm::Instruction *Inst) const; + /// CreateDefaultAlignedTempAlloca - This creates an alloca with the /// default ABI alignment of the given LLVM type. /// Index: lib/CodeGen/CodeGenFunction.cpp =================================================================== --- lib/CodeGen/CodeGenFunction.cpp +++ lib/CodeGen/CodeGenFunction.cpp @@ -442,7 +442,7 @@ "callsite"); llvm::Value *args[] = { - llvm::ConstantExpr::getBitCast(CurFn, PointerTy), + llvm::ConstantExpr::getPointerCast(CurFn, PointerTy), CallSite }; Index: lib/CodeGen/CGVTables.cpp =================================================================== --- lib/CodeGen/CGVTables.cpp +++ lib/CodeGen/CGVTables.cpp @@ -550,7 +550,7 @@ return addOffsetConstant(component.getOffsetToTop()); case VTableComponent::CK_RTTI: - return builder.add(llvm::ConstantExpr::getBitCast(rtti, CGM.Int8PtrTy)); + return builder.add(llvm::ConstantExpr::getPointerCast(rtti, CGM.Int8PtrTy)); case VTableComponent::CK_FunctionPointer: case VTableComponent::CK_CompleteDtorPointer: @@ -594,7 +594,7 @@ llvm::Constant *fn = CGM.CreateRuntimeFunction(fnTy, name); if (auto f = dyn_cast<llvm::Function>(fn)) f->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - return llvm::ConstantExpr::getBitCast(fn, CGM.Int8PtrTy); + return llvm::ConstantExpr::getPointerCast(fn, CGM.Int8PtrTy); }; llvm::Constant *fnPtr; @@ -628,7 +628,7 @@ fnPtr = CGM.GetAddrOfFunction(GD, fnTy, /*ForVTable=*/true); } - fnPtr = llvm::ConstantExpr::getBitCast(fnPtr, CGM.Int8PtrTy); + fnPtr = llvm::ConstantExpr::getPointerCast(fnPtr, CGM.Int8PtrTy); builder.add(fnPtr); return; } Index: lib/CodeGen/CGVTT.cpp =================================================================== --- lib/CodeGen/CGVTT.cpp +++ lib/CodeGen/CGVTT.cpp @@ -84,7 +84,7 @@ VTable->getValueType(), VTable, Idxs, /*InBounds=*/true, /*InRangeIndex=*/1); - Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy); + Init = llvm::ConstantExpr::getPointerCast(Init, Int8PtrTy); VTTComponents.push_back(Init); } Index: lib/CodeGen/CGOpenMPRuntime.cpp =================================================================== --- lib/CodeGen/CGOpenMPRuntime.cpp +++ lib/CodeGen/CGOpenMPRuntime.cpp @@ -924,7 +924,7 @@ DefaultOpenMPPSource = CGM.GetAddrOfConstantCString(";unknown;unknown;0;0;;").getPointer(); DefaultOpenMPPSource = - llvm::ConstantExpr::getBitCast(DefaultOpenMPPSource, CGM.Int8PtrTy); + llvm::ConstantExpr::getPointerCast(DefaultOpenMPPSource, CGM.Int8PtrTy); } ConstantInitBuilder builder(CGM); @@ -2918,7 +2918,7 @@ llvm::Module &M = CGM.getModule(); // Make sure the address has the right type. - llvm::Constant *AddrPtr = llvm::ConstantExpr::getBitCast(ID, CGM.VoidPtrTy); + llvm::Constant *AddrPtr = llvm::ConstantExpr::getPointerCast(ID, CGM.VoidPtrTy); // Create constant string with the name. llvm::Constant *StrPtrInit = llvm::ConstantDataArray::getString(C, Name); @@ -2928,7 +2928,7 @@ llvm::GlobalValue::InternalLinkage, StrPtrInit, ".omp_offloading.entry_name"); Str->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); - llvm::Constant *StrPtr = llvm::ConstantExpr::getBitCast(Str, CGM.Int8PtrTy); + llvm::Constant *StrPtr = llvm::ConstantExpr::getPointerCast(Str, CGM.Int8PtrTy); // We can't have any padding between symbols, so we need to have 1-byte // alignment. @@ -4871,7 +4871,7 @@ // the device, because these functions will be entry points to the device. if (CGM.getLangOpts().OpenMPIsDevice) { - OutlinedFnID = llvm::ConstantExpr::getBitCast(OutlinedFn, CGM.Int8PtrTy); + OutlinedFnID = llvm::ConstantExpr::getPointerCast(OutlinedFn, CGM.Int8PtrTy); OutlinedFn->setLinkage(llvm::GlobalValue::ExternalLinkage); } else OutlinedFnID = new llvm::GlobalVariable( Index: lib/CodeGen/CGExprConstant.cpp =================================================================== --- lib/CodeGen/CGExprConstant.cpp +++ lib/CodeGen/CGExprConstant.cpp @@ -1316,7 +1316,7 @@ if (!Offset->isNullValue()) { unsigned AS = C->getType()->getPointerAddressSpace(); llvm::Type *CharPtrTy = Int8Ty->getPointerTo(AS); - llvm::Constant *Casted = llvm::ConstantExpr::getBitCast(C, CharPtrTy); + llvm::Constant *Casted = llvm::ConstantExpr::getPointerCast(C, CharPtrTy); Casted = llvm::ConstantExpr::getGetElementPtr(Int8Ty, Casted, Offset); C = llvm::ConstantExpr::getPointerCast(Casted, C->getType()); } Index: lib/CodeGen/CGExpr.cpp =================================================================== --- lib/CodeGen/CGExpr.cpp +++ lib/CodeGen/CGExpr.cpp @@ -62,16 +62,37 @@ /// block. Address CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, CharUnits Align, const Twine &Name) { - auto Alloca = CreateTempAlloca(Ty, Name); + auto CastedAlloca = CreateTempAlloca(Ty, Name); + auto *Alloca = getAddrSpaceCastedAlloca(CastedAlloca); Alloca->setAlignment(Align.getQuantity()); - return Address(Alloca, Align); + return Address(CastedAlloca, Align); } /// CreateTempAlloca - This creates a alloca and inserts it into the entry /// block. -llvm::AllocaInst *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, - const Twine &Name) { - return new llvm::AllocaInst(Ty, nullptr, Name, AllocaInsertPt); +llvm::Instruction *CodeGenFunction::CreateTempAlloca(llvm::Type *Ty, + const Twine &Name) { + return CreateAlloca(Ty, Name, AllocaInsertPt); +} + +llvm::Instruction *CodeGenFunction::CreateAlloca(llvm::Type *Ty, + const Twine &Name, + llvm::Instruction *InsertPos) { + llvm::Instruction *V = new llvm::AllocaInst(Ty, nullptr, Name, InsertPos); + auto DefaultAddr = getTarget().getDefaultTargetAddressSpace(getLangOpts()); + if (DefaultAddr != 0) { + auto *DestTy = llvm::PointerType::get(V->getType()->getPointerElementType(), + DefaultAddr); + V = new llvm::AddrSpaceCastInst(V, DestTy, "", InsertPos); + } + return V; +} + +llvm::AllocaInst * +CodeGenFunction::getAddrSpaceCastedAlloca(llvm::Instruction *V) const { + if (auto *Cast = dyn_cast<llvm::AddrSpaceCastInst>(V)) + return cast<llvm::AllocaInst>(Cast->getOperand(0)); + return cast<llvm::AllocaInst>(V); } /// CreateDefaultAlignTempAlloca - This creates an alloca with the Index: lib/CodeGen/CGException.cpp =================================================================== --- lib/CodeGen/CGException.cpp +++ lib/CodeGen/CGException.cpp @@ -237,7 +237,7 @@ static llvm::Constant *getOpaquePersonalityFn(CodeGenModule &CGM, const EHPersonality &Personality) { llvm::Constant *Fn = getPersonalityFn(CGM, Personality); - return llvm::ConstantExpr::getBitCast(Fn, CGM.Int8PtrTy); + return llvm::ConstantExpr::getPointerCast(Fn, CGM.Int8PtrTy); } /// Check whether a landingpad instruction only uses C++ features. @@ -1520,7 +1520,7 @@ llvm::Function *FrameRecoverFn = llvm::Intrinsic::getDeclaration( &CGM.getModule(), llvm::Intrinsic::localrecover); llvm::Constant *ParentI8Fn = - llvm::ConstantExpr::getBitCast(ParentCGF.CurFn, Int8PtrTy); + llvm::ConstantExpr::getPointerCast(ParentCGF.CurFn, Int8PtrTy); RecoverCall = Builder.CreateCall( FrameRecoverFn, {ParentI8Fn, ParentFP, llvm::ConstantInt::get(Int32Ty, FrameEscapeIdx)}); @@ -1585,7 +1585,7 @@ llvm::Function *RecoverFPIntrin = CGM.getIntrinsic(llvm::Intrinsic::x86_seh_recoverfp); llvm::Constant *ParentI8Fn = - llvm::ConstantExpr::getBitCast(ParentCGF.CurFn, Int8PtrTy); + llvm::ConstantExpr::getPointerCast(ParentCGF.CurFn, Int8PtrTy); ParentFP = Builder.CreateCall(RecoverFPIntrin, {ParentI8Fn, EntryFP}); } @@ -1812,7 +1812,7 @@ llvm::Function *FilterFunc = HelperCGF.GenerateSEHFilterFunction(*this, *Except); llvm::Constant *OpaqueFunc = - llvm::ConstantExpr::getBitCast(FilterFunc, Int8PtrTy); + llvm::ConstantExpr::getPointerCast(FilterFunc, Int8PtrTy); CatchScope->setHandler(0, OpaqueFunc, createBasicBlock("__except.ret")); } Index: lib/CodeGen/CGDeclCXX.cpp =================================================================== --- lib/CodeGen/CGDeclCXX.cpp +++ lib/CodeGen/CGDeclCXX.cpp @@ -135,7 +135,7 @@ CharUnits WidthChars = CGF.getContext().getTypeSizeInChars(D.getType()); uint64_t Width = WidthChars.getQuantity(); llvm::Value *Args[2] = { llvm::ConstantInt::getSigned(CGF.Int64Ty, Width), - llvm::ConstantExpr::getBitCast(Addr, CGF.Int8PtrTy)}; + llvm::ConstantExpr::getPointerCast(Addr, CGF.Int8PtrTy)}; CGF.Builder.CreateCall(InvariantStart, Args); } Index: lib/CodeGen/CGDecl.cpp =================================================================== --- lib/CodeGen/CGDecl.cpp +++ lib/CodeGen/CGDecl.cpp @@ -1075,7 +1075,15 @@ llvm::AllocaInst *vla = Builder.CreateAlloca(llvmTy, elementCount, "vla"); vla->setAlignment(alignment.getQuantity()); - address = Address(vla, alignment); + llvm::Value *V = vla; + auto DefaultAddr = getTarget().getDefaultTargetAddressSpace(getLangOpts()); + if (DefaultAddr != 0) { + auto *DestTy = + llvm::PointerType::get(vla->getType()->getElementType(), DefaultAddr); + V = Builder.CreateAddrSpaceCast(vla, DestTy); + } + + address = Address(V, alignment); } setAddrOfLocalVar(&D, address); @@ -1244,7 +1252,7 @@ // Otherwise, create a temporary global with the initializer then // memcpy from the global to the alloca. std::string Name = getStaticDeclName(CGM, D); - unsigned AS = 0; + unsigned AS = CGM.getContext().getTargetConstantAddressSpace(); if (getLangOpts().OpenCL) { AS = CGM.getContext().getTargetAddressSpace(LangAS::opencl_constant); BP = llvm::PointerType::getInt8PtrTy(getLLVMContext(), AS); Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -3643,18 +3643,19 @@ if (llvm::StructType *ArgStruct = CallInfo.getArgStruct()) { ArgMemoryLayout = CGM.getDataLayout().getStructLayout(ArgStruct); llvm::Instruction *IP = CallArgs.getStackBase(); - llvm::AllocaInst *AI; + llvm::Instruction *CastedAI; if (IP) { IP = IP->getNextNode(); - AI = new llvm::AllocaInst(ArgStruct, "argmem", IP); + CastedAI = CreateAlloca(ArgStruct, "argmem", IP); } else { - AI = CreateTempAlloca(ArgStruct, "argmem"); + CastedAI = CreateTempAlloca(ArgStruct, "argmem"); } auto Align = CallInfo.getArgStructAlignment(); + auto *AI = getAddrSpaceCastedAlloca(CastedAI); AI->setAlignment(Align.getQuantity()); AI->setUsedWithInAlloca(true); assert(AI->isUsedWithInAlloca() && !AI->isStaticAlloca()); - ArgMemory = Address(AI, Align); + ArgMemory = Address(CastedAI, Align); } // Helper function to drill into the inalloca allocation. Index: lib/CodeGen/CGBuiltin.cpp =================================================================== --- lib/CodeGen/CGBuiltin.cpp +++ lib/CodeGen/CGBuiltin.cpp @@ -2312,7 +2312,7 @@ case Builtin::BI__GetExceptionInfo: { if (llvm::GlobalVariable *GV = CGM.getCXXABI().getThrowInfo(FD->getParamDecl(0)->getType())) - return RValue::get(llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy)); + return RValue::get(llvm::ConstantExpr::getPointerCast(GV, CGM.Int8PtrTy)); break; } Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -1997,16 +1997,6 @@ return llvm::makeArrayRef(GCCRegNames); } -static const unsigned AMDGPUAddrSpaceMap[] = { - 1, // opencl_global - 3, // opencl_local - 2, // opencl_constant - 4, // opencl_generic - 1, // cuda_device - 2, // cuda_constant - 3 // cuda_shared -}; - // If you edit the description strings, make sure you update // getPointerWidthV(). @@ -2020,9 +2010,18 @@ "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64"; class AMDGPUTargetInfo final : public TargetInfo { + static const unsigned AddrSpaceMap_[7]; static const Builtin::Info BuiltinInfo[]; static const char * const GCCRegNames[]; + enum AddrSpaceKind { + AS_Private = 0, + AS_Global = 1, + AS_Constant = 2, + AS_Local = 3, + AS_Generic = 4 + }; + /// \brief The GPU profiles supported by the AMDGPU target. enum GPUKind { GK_NONE, @@ -2066,7 +2065,7 @@ resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ? DataLayoutStringSI : DataLayoutStringR600); - AddrSpaceMap = &AMDGPUAddrSpaceMap; + AddrSpaceMap = &AddrSpaceMap_; UseAddrSpaceMapMangling = true; } @@ -2254,6 +2253,15 @@ } } + unsigned + getDefaultTargetAddressSpace(const LangOptions &Opts) const override { + // OpenCL sets address space explicitly in AST. The default case (type + // qualifier containing no address space) represents private address space. + if (Opts.OpenCL) + return AS_Private; + return AS_Generic; + } + LangAS::ID getOpenCLImageAddrSpace() const override { return LangAS::opencl_constant; } @@ -2276,6 +2284,16 @@ } }; +const unsigned AMDGPUTargetInfo::AddrSpaceMap_[] = { + AS_Global, // opencl_global + AS_Local, // opencl_local + AS_Constant, // opencl_constant + AS_Generic, // opencl_generic + AS_Global, // cuda_device + AS_Constant, // cuda_constant + AS_Local // cuda_shared +}; + const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { #define BUILTIN(ID, TYPE, ATTRS) \ { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr }, Index: lib/AST/ASTContext.cpp =================================================================== --- lib/AST/ASTContext.cpp +++ lib/AST/ASTContext.cpp @@ -9538,6 +9538,16 @@ return getTargetInfo().getNullPointerValue(AS); } +unsigned ASTContext::getTargetConstantAddressSpace() const { + return getTargetInfo().getConstantAddressSpace(); +} + +unsigned ASTContext::getTargetAddressSpace(Qualifiers Q) const { + return Q.hasAddressSpace() + ? getTargetAddressSpace(Q.getAddressSpace()) + : getTargetInfo().getDefaultTargetAddressSpace(LangOpts); +} + // Explicitly instantiate this in case a Redeclarable<T> is used from a TU that // doesn't include ASTContext.h template Index: include/clang/Basic/TargetInfo.h =================================================================== --- include/clang/Basic/TargetInfo.h +++ include/clang/Basic/TargetInfo.h @@ -307,6 +307,10 @@ return 0; } + virtual unsigned getConstantAddressSpace() const { + return 0; + } + /// \brief Return the size of '_Bool' and C++ 'bool' for this target, in bits. unsigned getBoolWidth() const { return BoolWidth; } @@ -953,6 +957,10 @@ return *AddrSpaceMap; } + virtual unsigned getDefaultTargetAddressSpace(const LangOptions &Opt) const { + return 0; + } + /// \brief Retrieve the name of the platform as it is used in the /// availability attribute. StringRef getPlatformName() const { return PlatformName; } Index: include/clang/AST/ASTContext.h =================================================================== --- include/clang/AST/ASTContext.h +++ include/clang/AST/ASTContext.h @@ -2301,12 +2301,12 @@ QualType typeDomain) const; unsigned getTargetAddressSpace(QualType T) const { + if (T->isFunctionType() && !T.getQualifiers().hasAddressSpace()) + return 0; return getTargetAddressSpace(T.getQualifiers()); } - unsigned getTargetAddressSpace(Qualifiers Q) const { - return getTargetAddressSpace(Q.getAddressSpace()); - } + unsigned getTargetAddressSpace(Qualifiers Q) const; unsigned getTargetAddressSpace(unsigned AS) const { if (AS < LangAS::Offset || AS >= LangAS::Offset + LangAS::Count) @@ -2319,6 +2319,8 @@ /// constant folding. uint64_t getTargetNullPointerValue(QualType QT) const; + unsigned getTargetConstantAddressSpace() const; + bool addressSpaceMapManglingFor(unsigned AS) const { return AddrSpaceMapMangling || AS < LangAS::Offset ||
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits