diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 18 | ||||
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/AMDGPU.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/AMDGPU.h | 3 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/DirectX.h | 5 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/PPC.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/PPC.h | 3 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/SPIR.h | 15 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/WebAssembly.cpp | 6 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/WebAssembly.h | 3 | ||||
-rw-r--r-- | clang/lib/Basic/Targets/X86.h | 10 | ||||
-rw-r--r-- | clang/lib/Frontend/ASTUnit.cpp | 2 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInstance.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Interpreter/Interpreter.cpp | 3 |
14 files changed, 51 insertions, 40 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 6d81903..6a74e98 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2458,15 +2458,6 @@ static bool mustSkipTailPadding(TargetCXXABI ABI, const CXXRecordDecl *RD) { llvm_unreachable("bad tail-padding use kind"); } -static bool isMsLayout(const ASTContext &Context) { - // Check if it's CUDA device compilation; ensure layout consistency with host. - if (Context.getLangOpts().CUDA && Context.getLangOpts().CUDAIsDevice && - Context.getAuxTargetInfo()) - return Context.getAuxTargetInfo()->getCXXABI().isMicrosoft(); - - return Context.getTargetInfo().getCXXABI().isMicrosoft(); -} - // This section contains an implementation of struct layout that is, up to the // included tests, compatible with cl.exe (2013). The layout produced is // significantly different than those produced by the Itanium ABI. Here we note @@ -3399,7 +3390,7 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const { const ASTRecordLayout *NewEntry = nullptr; - if (isMsLayout(*this)) { + if (getTargetInfo().hasMicrosoftRecordLayout()) { if (const auto *RD = dyn_cast<CXXRecordDecl>(D)) { EmptySubobjectMap EmptySubobjects(*this, RD); MicrosoftRecordLayoutBuilder Builder(*this, &EmptySubobjects); @@ -3656,7 +3647,8 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD, bool HasOwnVBPtr = Layout.hasOwnVBPtr(); // Vtable pointer. - if (CXXRD->isDynamicClass() && !PrimaryBase && !isMsLayout(C)) { + if (CXXRD->isDynamicClass() && !PrimaryBase && + !C.getTargetInfo().hasMicrosoftRecordLayout()) { PrintOffset(OS, Offset, IndentLevel); OS << '(' << *RD << " vtable pointer)\n"; } else if (HasOwnVFPtr) { @@ -3754,7 +3746,7 @@ static void DumpRecordLayout(raw_ostream &OS, const RecordDecl *RD, PrintIndentNoOffset(OS, IndentLevel - 1); OS << "[sizeof=" << Layout.getSize().getQuantity(); - if (CXXRD && !isMsLayout(C)) + if (CXXRD && !C.getTargetInfo().hasMicrosoftRecordLayout()) OS << ", dsize=" << Layout.getDataSize().getQuantity(); OS << ", align=" << Layout.getAlignment().getQuantity(); if (C.getTargetInfo().defaultsToAIXPowerAlignment()) @@ -3793,7 +3785,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD, raw_ostream &OS, OS << "\nLayout: "; OS << "<ASTRecordLayout\n"; OS << " Size:" << toBits(Info.getSize()) << "\n"; - if (!isMsLayout(*this)) + if (!getTargetInfo().hasMicrosoftRecordLayout()) OS << " DataSize:" << toBits(Info.getDataSize()) << "\n"; OS << " Alignment:" << toBits(Info.getAlignment()) << "\n"; if (Target->defaultsToAIXPowerAlignment()) diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 9429a31..09b6a1f 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -176,6 +176,8 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) { ? TargetCXXABI::Microsoft : TargetCXXABI::GenericItanium); + HasMicrosoftRecordLayout = TheCXXABI.isMicrosoft(); + // Default to an empty address space map. AddrSpaceMap = &DefaultAddrSpaceMap; UseAddrSpaceMapMangling = false; @@ -410,7 +412,8 @@ bool TargetInfo::isTypeSigned(IntType T) { /// Apply changes to the target information with respect to certain /// language options which change the target configuration and adjust /// the language based on the target options where applicable. -void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { +void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) { if (Opts.NoBitFieldTypeAlign) UseBitFieldTypeAlignment = false; @@ -550,6 +553,10 @@ void TargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { if (Opts.FakeAddressSpaceMap) AddrSpaceMap = &FakeAddrSpaceMap; + + // Check if it's CUDA device compilation; ensure layout consistency with host. + if (Opts.CUDA && Opts.CUDAIsDevice && Aux && !HasMicrosoftRecordLayout) + HasMicrosoftRecordLayout = Aux->getCXXABI().isMicrosoft(); } bool TargetInfo::initFeatureMap( diff --git a/clang/lib/Basic/Targets/AMDGPU.cpp b/clang/lib/Basic/Targets/AMDGPU.cpp index 8d5489b..cebcfa3 100644 --- a/clang/lib/Basic/Targets/AMDGPU.cpp +++ b/clang/lib/Basic/Targets/AMDGPU.cpp @@ -271,8 +271,9 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple, HalfArgsAndReturns = true; } -void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { - TargetInfo::adjust(Diags, Opts); +void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) { + TargetInfo::adjust(Diags, Opts, Aux); // ToDo: There are still a few places using default address space as private // address space in OpenCL, which needs to be cleaned up, then the references // to OpenCL can be removed from the following line. diff --git a/clang/lib/Basic/Targets/AMDGPU.h b/clang/lib/Basic/Targets/AMDGPU.h index 1358abb..8b7fab3 100644 --- a/clang/lib/Basic/Targets/AMDGPU.h +++ b/clang/lib/Basic/Targets/AMDGPU.h @@ -89,7 +89,8 @@ public: void setAddressSpaceMap(bool DefaultIsPrivate); - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override; uint64_t getPointerWidthV(LangAS AS) const override { if (isR600(getTriple())) diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h index 1729a01..17240cf 100644 --- a/clang/lib/Basic/Targets/DirectX.h +++ b/clang/lib/Basic/Targets/DirectX.h @@ -95,8 +95,9 @@ public: return TargetInfo::VoidPtrBuiltinVaList; } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - TargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + TargetInfo::adjust(Diags, Opts, Aux); // The static values this addresses do not apply outside of the same thread // This protection is neither available nor needed Opts.ThreadsafeStatics = false; diff --git a/clang/lib/Basic/Targets/PPC.cpp b/clang/lib/Basic/Targets/PPC.cpp index 05a5dc2..ef18354 100644 --- a/clang/lib/Basic/Targets/PPC.cpp +++ b/clang/lib/Basic/Targets/PPC.cpp @@ -758,10 +758,11 @@ void PPCTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const { llvm::PPC::fillValidCPUList(Values); } -void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) { +void PPCTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) { if (HasAltivec) Opts.AltiVec = 1; - TargetInfo::adjust(Diags, Opts); + TargetInfo::adjust(Diags, Opts, Aux); if (LongDoubleFormat != &llvm::APFloat::IEEEdouble()) LongDoubleFormat = Opts.PPCIEEELongDouble ? &llvm::APFloat::IEEEquad() diff --git a/clang/lib/Basic/Targets/PPC.h b/clang/lib/Basic/Targets/PPC.h index 17057ce..9f3a4cd 100644 --- a/clang/lib/Basic/Targets/PPC.h +++ b/clang/lib/Basic/Targets/PPC.h @@ -88,7 +88,8 @@ public: } // Set the language option for altivec based on our value. - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override; // Note: GCC recognizes the following additional cpus: // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801, diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h index b416a01..1abf798 100644 --- a/clang/lib/Basic/Targets/SPIR.h +++ b/clang/lib/Basic/Targets/SPIR.h @@ -205,8 +205,9 @@ public: AddrSpaceMap = DefaultIsGeneric ? &SPIRDefIsGenMap : &SPIRDefIsPrivMap; } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - TargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + TargetInfo::adjust(Diags, Opts, Aux); // FIXME: SYCL specification considers unannotated pointers and references // to be pointing to the generic address space. See section 5.9.3 of // SYCL 2020 specification. @@ -383,8 +384,9 @@ public: std::optional<LangAS> getConstantAddressSpace() const override { return ConstantAS; } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - BaseSPIRVTargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + BaseSPIRVTargetInfo::adjust(Diags, Opts, Aux); // opencl_constant will map to UniformConstant in SPIR-V if (Opts.OpenCL) ConstantAS = LangAS::opencl_constant; @@ -446,8 +448,9 @@ public: void setAuxTarget(const TargetInfo *Aux) override; - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - TargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + TargetInfo::adjust(Diags, Opts, Aux); } bool hasInt128Type() const override { return TargetInfo::hasInt128Type(); } diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index f19c57f..af25d25 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -372,9 +372,9 @@ WebAssemblyTargetInfo::getTargetBuiltins() const { return {{&BuiltinStrings, BuiltinInfos}}; } -void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, - LangOptions &Opts) { - TargetInfo::adjust(Diags, Opts); +void WebAssemblyTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) { + TargetInfo::adjust(Diags, Opts, Aux); // Turn off POSIXThreads and ThreadModel so that we don't predefine _REENTRANT // or __STDCPP_THREADS__ if we will eventually end up stripping atomics // because they are unsupported. diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index d5aee5c..57b366c 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -176,7 +176,8 @@ private: bool hasProtectedVisibility() const override { return false; } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override; + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override; }; class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo diff --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h index ecb31ff..ebc59c9 100644 --- a/clang/lib/Basic/Targets/X86.h +++ b/clang/lib/Basic/Targets/X86.h @@ -441,8 +441,9 @@ public: uint64_t getPointerAlignV(LangAS AddrSpace) const override { return getPointerWidthV(AddrSpace); } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - TargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + TargetInfo::adjust(Diags, Opts, Aux); IsOpenCL = Opts.OpenCL; } @@ -839,8 +840,9 @@ public: return llvm::IntegerType::MAX_INT_BITS; } - void adjust(DiagnosticsEngine &Diags, LangOptions &Opts) override { - TargetInfo::adjust(Diags, Opts); + void adjust(DiagnosticsEngine &Diags, LangOptions &Opts, + const TargetInfo *Aux) override { + TargetInfo::adjust(Diags, Opts, Aux); IsOpenCL = Opts.OpenCL; } diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp index 4ebec8e..b7f52fd 100644 --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -631,7 +631,7 @@ private: // // FIXME: We shouldn't need to do this, the target should be immutable once // created. This complexity should be lifted elsewhere. - Target->adjust(PP.getDiagnostics(), LangOpt); + Target->adjust(PP.getDiagnostics(), LangOpt, /*AuxTarget=*/nullptr); // Initialize the preprocessor. PP.Initialize(*Target); diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index 09a66b6..6f8cc01 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -148,7 +148,7 @@ bool CompilerInstance::createTarget() { // Inform the target of the language options. // FIXME: We shouldn't need to do this, the target should be immutable once // created. This complexity should be lifted elsewhere. - getTarget().adjust(getDiagnostics(), getLangOpts()); + getTarget().adjust(getDiagnostics(), getLangOpts(), getAuxTarget()); if (auto *Aux = getAuxTarget()) getTarget().setAuxTarget(Aux); @@ -454,7 +454,7 @@ void CompilerInstance::createPreprocessor(TranslationUnitKind TUKind) { getSourceManager(), *HeaderInfo, *this, /*IdentifierInfoLookup=*/nullptr, /*OwnsHeaderSearch=*/true, TUKind); - getTarget().adjust(getDiagnostics(), getLangOpts()); + getTarget().adjust(getDiagnostics(), getLangOpts(), getAuxTarget()); PP->Initialize(getTarget(), getAuxTarget()); if (PPOpts.DetailedRecord) diff --git a/clang/lib/Interpreter/Interpreter.cpp b/clang/lib/Interpreter/Interpreter.cpp index 98fc0a5..ed3bae5 100644 --- a/clang/lib/Interpreter/Interpreter.cpp +++ b/clang/lib/Interpreter/Interpreter.cpp @@ -132,7 +132,8 @@ CreateCI(const llvm::opt::ArgStringList &Argv) { "Initialization failed. " "Target is missing"); - Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts()); + Clang->getTarget().adjust(Clang->getDiagnostics(), Clang->getLangOpts(), + Clang->getAuxTarget()); // Don't clear the AST before backend codegen since we do codegen multiple // times, reusing the same AST. |