Mercurial > hg > CbC > CbC_llvm
diff clang/lib/CodeGen/CGDeclCXX.cpp @ 252:1f2b6ac9f198 llvm-original
LLVM16-1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 18 Aug 2023 09:04:13 +0900 |
parents | c4bab56944e8 |
children |
line wrap: on
line diff
--- a/clang/lib/CodeGen/CGDeclCXX.cpp Wed Nov 09 17:47:54 2022 +0900 +++ b/clang/lib/CodeGen/CGDeclCXX.cpp Fri Aug 18 09:04:13 2023 +0900 @@ -122,8 +122,8 @@ if (CGF.getContext().getLangOpts().OpenCL) { auto DestAS = CGM.getTargetCodeGenInfo().getAddrSpaceOfCxaAtexitPtrParam(); - auto DestTy = CGF.getTypes().ConvertType(Type)->getPointerTo( - CGM.getContext().getTargetAddressSpace(DestAS)); + auto DestTy = llvm::PointerType::get( + CGM.getLLVMContext(), CGM.getContext().getTargetAddressSpace(DestAS)); auto SrcAS = D.getType().getQualifiers().getAddressSpace(); if (DestAS == SrcAS) Argument = llvm::ConstantExpr::getBitCast(Addr.getPointer(), DestTy); @@ -132,12 +132,11 @@ // of the global destructor function should be adjusted accordingly. Argument = llvm::ConstantPointerNull::get(DestTy); } else { - Argument = llvm::ConstantExpr::getBitCast( - Addr.getPointer(), CGF.getTypes().ConvertType(Type)->getPointerTo()); + Argument = Addr.getPointer(); } // Otherwise, the standard logic requires a helper function. } else { - Addr = Addr.getElementBitCast(CGF.ConvertTypeForMem(Type)); + Addr = Addr.withElementType(CGF.ConvertTypeForMem(Type)); Func = CodeGenFunction(CGM) .generateDestroyHelper(Addr, Type, CGF.getDestroyer(DtorKind), CGF.needsEHCleanup(DtorKind), &D); @@ -195,12 +194,12 @@ // For example, in the above CUDA code, the static local variable s has a // "shared" address space qualifier, but the constructor of StructWithCtor // expects "this" in the "generic" address space. - unsigned ExpectedAddrSpace = getContext().getTargetAddressSpace(T); + unsigned ExpectedAddrSpace = getTypes().getTargetAddressSpace(T); unsigned ActualAddrSpace = GV->getAddressSpace(); llvm::Constant *DeclPtr = GV; if (ActualAddrSpace != ExpectedAddrSpace) { - llvm::PointerType *PTy = llvm::PointerType::getWithSamePointeeType( - GV->getType(), ExpectedAddrSpace); + llvm::PointerType *PTy = + llvm::PointerType::get(getLLVMContext(), ExpectedAddrSpace); DeclPtr = llvm::ConstantExpr::getAddrSpaceCast(DeclPtr, PTy); } @@ -214,9 +213,11 @@ &D, DeclAddr, D.getAttr<OMPThreadPrivateDeclAttr>()->getLocation(), PerformInit, this); } + bool NeedsDtor = + D.needsDestruction(getContext()) == QualType::DK_cxx_destructor; if (PerformInit) EmitDeclInit(*this, D, DeclAddr); - if (CGM.isTypeConstant(D.getType(), true)) + if (CGM.isTypeConstant(D.getType(), true, !NeedsDtor)) EmitDeclInvariant(*this, D, DeclPtr); else EmitDeclDestroy(*this, D, DeclAddr); @@ -278,8 +279,8 @@ } const CGFunctionInfo &FI = CGM.getTypes().arrangeLLVMFunctionInfo( - getContext().IntTy, /*instanceMethod=*/false, /*chainCall=*/false, - {getContext().IntTy}, FunctionType::ExtInfo(), {}, RequiredArgs::All); + getContext().IntTy, FnInfoOpts::None, {getContext().IntTy}, + FunctionType::ExtInfo(), {}, RequiredArgs::All); // Get the stub function type, int(*)(int,...). llvm::FunctionType *StubTy = @@ -640,7 +641,12 @@ /* Build the initializer for a C++20 module: This is arranged to be run only once regardless of how many times the module - might be included transitively. This arranged by using a control variable. + might be included transitively. This arranged by using a guard variable. + + If there are no initializers at all (and also no imported modules) we reduce + this to an empty function (since the Itanium ABI requires that this function + be available to a caller, which might be produced by a different + implementation). First we call any initializers for imported modules. We then call initializers for the Global Module Fragment (if present) @@ -652,13 +658,10 @@ while (!CXXGlobalInits.empty() && !CXXGlobalInits.back()) CXXGlobalInits.pop_back(); - // We create the function, even if it is empty, since an importer of this - // module will refer to it unconditionally (for the current implementation - // there is no way for the importer to know that an importee does not need - // an initializer to be run). + // As noted above, we create the function, even if it is empty. + // Module initializers for imported modules are emitted first. - // Module initializers for imported modules are emitted first. - // Collect the modules that we import + // Collect all the modules that we import SmallVector<Module *> AllImports; // Ones that we export for (auto I : Primary->Exports) @@ -685,7 +688,6 @@ FTy, llvm::Function::ExternalLinkage, FnName.str(), &getModule()); ModuleInits.push_back(Fn); } - AllImports.clear(); // Add any initializers with specified priority; this uses the same approach // as EmitCXXGlobalInitFunc(). @@ -703,13 +705,11 @@ for (; I < PrioE; ++I) ModuleInits.push_back(I->second); } - PrioritizedCXXGlobalInits.clear(); } // Now append the ones without specified priority. for (auto *F : CXXGlobalInits) ModuleInits.push_back(F); - CXXGlobalInits.clear(); llvm::FunctionType *FTy = llvm::FunctionType::get(VoidTy, false); const CGFunctionInfo &FI = getTypes().arrangeNullaryFunction(); @@ -719,7 +719,6 @@ // each init is run just once (even though a module might be imported // multiple times via nested use). llvm::Function *Fn; - llvm::GlobalVariable *Guard = nullptr; { SmallString<256> InitFnName; llvm::raw_svector_ostream Out(InitFnName); @@ -729,18 +728,26 @@ FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false, llvm::GlobalVariable::ExternalLinkage); - Guard = new llvm::GlobalVariable(getModule(), Int8Ty, /*isConstant=*/false, - llvm::GlobalVariable::InternalLinkage, - llvm::ConstantInt::get(Int8Ty, 0), - InitFnName.str() + "__in_chrg"); + // If we have a completely empty initializer then we do not want to create + // the guard variable. + ConstantAddress GuardAddr = ConstantAddress::invalid(); + if (!AllImports.empty() || !PrioritizedCXXGlobalInits.empty() || + !CXXGlobalInits.empty()) { + // Create the guard var. + llvm::GlobalVariable *Guard = new llvm::GlobalVariable( + getModule(), Int8Ty, /*isConstant=*/false, + llvm::GlobalVariable::InternalLinkage, + llvm::ConstantInt::get(Int8Ty, 0), InitFnName.str() + "__in_chrg"); + CharUnits GuardAlign = CharUnits::One(); + Guard->setAlignment(GuardAlign.getAsAlign()); + GuardAddr = ConstantAddress(Guard, Int8Ty, GuardAlign); + } + CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn, ModuleInits, + GuardAddr); } - CharUnits GuardAlign = CharUnits::One(); - Guard->setAlignment(GuardAlign.getAsAlign()); - CodeGenFunction(*this).GenerateCXXGlobalInitFunc( - Fn, ModuleInits, ConstantAddress(Guard, Int8Ty, GuardAlign)); - // We allow for the case that a module object is added to a linked binary - // without a specific call to the the initializer. This also ensure that + // We allow for the case that a module object is added to a linked binary + // without a specific call to the the initializer. This also ensures that // implementation partition initializers are called when the partition // is not imported as an interface. AddGlobalCtor(Fn); @@ -759,6 +766,10 @@ Fn->addFnAttr("device-init"); } + // We are done with the inits. + AllImports.clear(); + PrioritizedCXXGlobalInits.clear(); + CXXGlobalInits.clear(); ModuleInits.clear(); } @@ -868,13 +879,15 @@ // Include the filename in the symbol name. Including "sub_" matches gcc // and makes sure these symbols appear lexicographically behind the symbols - // with priority emitted above. + // with priority emitted above. Module implementation units behave the same + // way as a non-modular TU with imports. llvm::Function *Fn; - if (CXX20ModuleInits && getContext().getModuleForCodeGen()) { + if (CXX20ModuleInits && getContext().getCurrentNamedModule() && + !getContext().getCurrentNamedModule()->isModuleImplementation()) { SmallString<256> InitFnName; llvm::raw_svector_ostream Out(InitFnName); cast<ItaniumMangleContext>(getCXXABI().getMangleContext()) - .mangleModuleInitializer(getContext().getModuleForCodeGen(), Out); + .mangleModuleInitializer(getContext().getCurrentNamedModule(), Out); Fn = CreateGlobalInitOrCleanUpFunction( FTy, llvm::Twine(InitFnName), FI, SourceLocation(), false, llvm::GlobalVariable::ExternalLinkage);