https://github.com/sarnex updated https://github.com/llvm/llvm-project/pull/126956
>From 044158c176316e6c9f44ce1487ff631c8a0d15c4 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Tue, 4 Mar 2025 11:16:34 -0800 Subject: [PATCH 1/4] [clang] Add isOffloadingTarget function to LangOpts Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/include/clang/Basic/LangOptions.h | 4 ++++ clang/lib/CodeGen/CGOpenMPRuntime.cpp | 7 +++---- clang/lib/CodeGen/CodeGenModule.cpp | 2 +- clang/lib/CodeGen/CodeGenModule.h | 3 +-- clang/lib/Frontend/CompilerInvocation.cpp | 4 ++++ clang/lib/Sema/SemaType.cpp | 16 ++++------------ 6 files changed, 17 insertions(+), 19 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index e925e0f3b5d85..d722ca2d926b2 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -636,6 +636,8 @@ class LangOptions : public LangOptionsBase { bool AtomicFineGrainedMemory = false; bool AtomicIgnoreDenormalMode = false; + bool IsOffloadingTarget = false; + LangOptions(); /// Set language defaults for the given input language and @@ -838,6 +840,8 @@ class LangOptions : public LangOptionsBase { return FPExceptionModeKind::FPE_Ignore; return EM; } + + bool isOffloadingTarget() const { return IsOffloadingTarget; } }; /// Floating point control options diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 06a652c146fb9..f61b46c4369a5 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -2613,9 +2613,8 @@ void CGOpenMPRuntime::emitDistributeStaticInit( emitUpdateLocation(CGF, Loc, OMP_IDENT_WORK_DISTRIBUTE); llvm::Value *ThreadId = getThreadID(CGF, Loc); llvm::FunctionCallee StaticInitFunction; - bool isGPUDistribute = - CGM.getLangOpts().OpenMPIsTargetDevice && - (CGM.getTriple().isAMDGCN() || CGM.getTriple().isNVPTX()); + bool isGPUDistribute = CGM.getLangOpts().OpenMPIsTargetDevice && + CGM.getLangOpts().isOffloadingTarget(); StaticInitFunction = OMPBuilder.createForStaticInitFunction( Values.IVSize, Values.IVSigned, isGPUDistribute); @@ -2645,7 +2644,7 @@ void CGOpenMPRuntime::emitForStaticFinish(CodeGenFunction &CGF, auto DL = ApplyDebugLocation::CreateDefaultArtificial(CGF, Loc); if (isOpenMPDistributeDirective(DKind) && CGM.getLangOpts().OpenMPIsTargetDevice && - (CGM.getTriple().isAMDGCN() || CGM.getTriple().isNVPTX())) + CGM.getLangOpts().isOffloadingTarget()) CGF.EmitRuntimeCall( OMPBuilder.getOrCreateRuntimeFunction( CGM.getModule(), OMPRTL___kmpc_distribute_static_fini), diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index bca0a932b3495..9080b226a7b8b 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -843,7 +843,7 @@ static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, static bool isStackProtectorOn(const LangOptions &LangOpts, const llvm::Triple &Triple, clang::LangOptions::StackProtectorMode Mode) { - if (Triple.isAMDGPU() || Triple.isNVPTX()) + if (LangOpts.isOffloadingTarget()) return false; return LangOpts.getStackProtector() == Mode; } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index a72b4f7338767..3448c0ed06335 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1078,8 +1078,7 @@ class CodeGenModule : public CodeGenTypeCache { bool shouldEmitRTTI(bool ForEH = false) { return (ForEH || getLangOpts().RTTI) && !getLangOpts().CUDAIsDevice && !(getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice && - (getTriple().isNVPTX() || getTriple().isAMDGPU() || - getTriple().isSPIRV())); + getLangOpts().isOffloadingTarget()); } /// Get the address of the RTTI descriptor for the given type. diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 4eb743acf327f..33d26ee7f9f7d 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4357,6 +4357,10 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.OpenACCMacroOverride = A->getValue(); } + Opts.IsOffloadingTarget = + (Opts.OpenMPIsTargetDevice || Opts.SYCLIsDevice || Opts.CUDAIsDevice) && + (T.isNVPTX() || T.isAMDGCN() || T.isSPIROrSPIRV()); + // FIXME: Eliminate this dependency. unsigned Opt = getOptimizationLevel(Args, IK, Diags), OptSize = getOptimizationLevelSize(Args); diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 11943c0b53591..0f115a6f04509 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1122,8 +1122,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { } case DeclSpec::TST_int128: if (!S.Context.getTargetInfo().hasInt128Type() && - !(S.getLangOpts().SYCLIsDevice || S.getLangOpts().CUDAIsDevice || - (S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice))) + !(S.getLangOpts().isOffloadingTarget())) S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << "__int128"; if (DS.getTypeSpecSign() == TypeSpecifierSign::Unsigned) @@ -1168,8 +1167,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { break; case DeclSpec::TST_float128: if (!S.Context.getTargetInfo().hasFloat128Type() && - !S.getLangOpts().SYCLIsDevice && !S.getLangOpts().CUDAIsDevice && - !(S.getLangOpts().OpenMP && S.getLangOpts().OpenMPIsTargetDevice)) + !S.getLangOpts().isOffloadingTarget()) S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << "__float128"; Result = Context.Float128Ty; @@ -8362,12 +8360,7 @@ static bool verifyValidIntegerConstantExpr(Sema &S, const ParsedAttr &Attr, /// match one of the standard Neon vector types. static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorKind VecKind) { - bool IsTargetCUDAAndHostARM = false; - if (S.getLangOpts().CUDAIsDevice) { - const TargetInfo *AuxTI = S.getASTContext().getAuxTargetInfo(); - IsTargetCUDAAndHostARM = - AuxTI && (AuxTI->getTriple().isAArch64() || AuxTI->getTriple().isARM()); - } + bool IsTargetOffloading = S.getLangOpts().isOffloadingTarget(); // Target must have NEON (or MVE, whose vectors are similar enough // not to need a separate attribute) @@ -8401,8 +8394,7 @@ static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, return; // Only certain element types are supported for Neon vectors. - if (!isPermittedNeonBaseType(CurType, VecKind, S) && - !IsTargetCUDAAndHostARM) { + if (!isPermittedNeonBaseType(CurType, VecKind, S) && !IsTargetOffloading) { S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType; Attr.setInvalid(); return; >From 417a6b092c1cfe6aed78167112a2855daec00182 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Fri, 21 Mar 2025 08:05:58 -0700 Subject: [PATCH 2/4] add two flags Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/include/clang/Basic/LangOptions.h | 7 ++++--- clang/lib/AST/Decl.cpp | 3 +-- clang/lib/CodeGen/CGOpenMPRuntime.cpp | 7 +++---- clang/lib/CodeGen/CodeGenModule.cpp | 2 +- clang/lib/CodeGen/CodeGenModule.h | 5 ++--- clang/lib/Driver/ToolChains/Clang.cpp | 10 ++++------ clang/lib/Frontend/CompilerInstance.cpp | 3 +-- clang/lib/Frontend/CompilerInvocation.cpp | 7 +------ clang/lib/Frontend/InitPreprocessor.cpp | 4 +--- clang/lib/Sema/SemaDecl.cpp | 11 ++++------ clang/lib/Sema/SemaType.cpp | 6 +++--- .../ClangLinkerWrapper.cpp | 2 +- flang/lib/Frontend/CompilerInvocation.cpp | 20 ++++++------------- llvm/include/llvm/TargetParser/Triple.h | 3 +++ llvm/include/llvm/Transforms/IPO/Attributor.h | 4 +--- llvm/lib/ProfileData/InstrProf.cpp | 2 +- llvm/lib/Transforms/IPO/Attributor.cpp | 4 ++-- .../SanitizerBinaryMetadata.cpp | 3 +-- 18 files changed, 40 insertions(+), 63 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index d722ca2d926b2..bbebf7af9ede3 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -636,8 +636,6 @@ class LangOptions : public LangOptionsBase { bool AtomicFineGrainedMemory = false; bool AtomicIgnoreDenormalMode = false; - bool IsOffloadingTarget = false; - LangOptions(); /// Set language defaults for the given input language and @@ -841,7 +839,10 @@ class LangOptions : public LangOptionsBase { return EM; } - bool isOffloadingTarget() const { return IsOffloadingTarget; } + /// True when compiling for an offloading target device. + bool isTargetDevice() const { + return OpenMPIsTargetDevice || CUDAIsDevice || SYCLIsDevice; + } }; /// Floating point control options diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index e8aeacf24374f..5f5568518e0b9 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -810,8 +810,7 @@ LinkageComputer::getLVForNamespaceScopeDecl(const NamedDecl *D, // functions as the host-callable kernel functions are emitted at codegen. if (Context.getLangOpts().OpenMP && Context.getLangOpts().OpenMPIsTargetDevice && - ((Context.getTargetInfo().getTriple().isAMDGPU() || - Context.getTargetInfo().getTriple().isNVPTX()) || + (Context.getTargetInfo().getTriple().isGPU() || OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(Function))) LV.mergeVisibility(HiddenVisibility, /*newExplicit=*/false); diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index f61b46c4369a5..b706fa3759c0d 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -2613,8 +2613,8 @@ void CGOpenMPRuntime::emitDistributeStaticInit( emitUpdateLocation(CGF, Loc, OMP_IDENT_WORK_DISTRIBUTE); llvm::Value *ThreadId = getThreadID(CGF, Loc); llvm::FunctionCallee StaticInitFunction; - bool isGPUDistribute = CGM.getLangOpts().OpenMPIsTargetDevice && - CGM.getLangOpts().isOffloadingTarget(); + bool isGPUDistribute = + CGM.getLangOpts().OpenMPIsTargetDevice && CGM.getTriple().isGPU(); StaticInitFunction = OMPBuilder.createForStaticInitFunction( Values.IVSize, Values.IVSigned, isGPUDistribute); @@ -2643,8 +2643,7 @@ void CGOpenMPRuntime::emitForStaticFinish(CodeGenFunction &CGF, getThreadID(CGF, Loc)}; auto DL = ApplyDebugLocation::CreateDefaultArtificial(CGF, Loc); if (isOpenMPDistributeDirective(DKind) && - CGM.getLangOpts().OpenMPIsTargetDevice && - CGM.getLangOpts().isOffloadingTarget()) + CGM.getLangOpts().OpenMPIsTargetDevice && CGM.getTriple().isGPU()) CGF.EmitRuntimeCall( OMPBuilder.getOrCreateRuntimeFunction( CGM.getModule(), OMPRTL___kmpc_distribute_static_fini), diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 9080b226a7b8b..78c709a13982d 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -843,7 +843,7 @@ static void setVisibilityFromDLLStorageClass(const clang::LangOptions &LO, static bool isStackProtectorOn(const LangOptions &LangOpts, const llvm::Triple &Triple, clang::LangOptions::StackProtectorMode Mode) { - if (LangOpts.isOffloadingTarget()) + if (Triple.isGPU()) return false; return LangOpts.getStackProtector() == Mode; } diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index 3448c0ed06335..99515cb18dd64 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -1076,9 +1076,8 @@ class CodeGenModule : public CodeGenTypeCache { // Return whether RTTI information should be emitted for this target. bool shouldEmitRTTI(bool ForEH = false) { - return (ForEH || getLangOpts().RTTI) && !getLangOpts().CUDAIsDevice && - !(getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice && - getLangOpts().isOffloadingTarget()); + return (ForEH || getLangOpts().RTTI) && + (!getLangOpts().isTargetDevice() || !getTriple().isGPU()); } /// Get the address of the RTTI descriptor for the given type. diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 4ebbd241d2f0b..4f2d898ec540b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1101,8 +1101,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, if (JA.isDeviceOffloading(Action::OFK_OpenMP) && !Args.hasArg(options::OPT_nostdinc) && !Args.hasArg(options::OPT_nogpuinc) && - (getToolChain().getTriple().isNVPTX() || - getToolChain().getTriple().isAMDGCN())) { + getToolChain().getTriple().isGPU()) { if (!Args.hasArg(options::OPT_nobuiltininc)) { // Add openmp_wrappers/* to our system include path. This lets us wrap // standard library headers. @@ -1289,8 +1288,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA, // Without an offloading language we will include these headers directly. // Offloading languages will instead only use the declarations stored in // the resource directory at clang/lib/Headers/llvm_libc_wrappers. - if ((getToolChain().getTriple().isNVPTX() || - getToolChain().getTriple().isAMDGCN()) && + if (getToolChain().getTriple().isGPU() && C.getActiveOffloadKinds() == Action::OFK_None) { SmallString<128> P(llvm::sys::path::parent_path(D.Dir)); llvm::sys::path::append(P, "include"); @@ -6388,10 +6386,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddLastArg(CmdArgs, options::OPT_fconvergent_functions, options::OPT_fno_convergent_functions); - // NVPTX/AMDGCN doesn't support PGO or coverage. There's no runtime support + // GPUs don't support PGO or coverage. There's no runtime support // for sampling, overhead of call arc collection is way too high and there's // no way to collect the output. - if (!Triple.isNVPTX() && !Triple.isAMDGCN()) + if (!Triple.isGPU()) addPGOAndCoverageFlags(TC, C, JA, Output, Args, SanitizeArgs, CmdArgs); Args.AddLastArg(CmdArgs, options::OPT_fclang_abi_compat_EQ); diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp index c11c857ea0606..d23eaf1015b45 100644 --- a/clang/lib/Frontend/CompilerInstance.cpp +++ b/clang/lib/Frontend/CompilerInstance.cpp @@ -116,8 +116,7 @@ bool CompilerInstance::createTarget() { // Check whether AuxTarget exists, if not, then create TargetInfo for the // other side of CUDA/OpenMP/SYCL compilation. if (!getAuxTarget() && - (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || - getLangOpts().SYCLIsDevice) && + (getLangOpts().CUDA || getLangOpts().isTargetDevice()) && !getFrontendOpts().AuxTriple.empty()) { auto TO = std::make_shared<TargetOptions>(); TO->Triple = llvm::Triple::normalize(getFrontendOpts().AuxTriple); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 33d26ee7f9f7d..dae5ee38a3c4d 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4183,8 +4183,7 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL && Opts.OpenCLVersion == 200); - bool HasConvergentOperations = Opts.OpenMPIsTargetDevice || Opts.OpenCL || - Opts.CUDAIsDevice || Opts.SYCLIsDevice || + bool HasConvergentOperations = Opts.isTargetDevice() || Opts.OpenCL || Opts.HLSL || T.isAMDGPU() || T.isNVPTX(); Opts.ConvergentFunctions = Args.hasFlag(OPT_fconvergent_functions, OPT_fno_convergent_functions, @@ -4357,10 +4356,6 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args, Opts.OpenACCMacroOverride = A->getValue(); } - Opts.IsOffloadingTarget = - (Opts.OpenMPIsTargetDevice || Opts.SYCLIsDevice || Opts.CUDAIsDevice) && - (T.isNVPTX() || T.isAMDGCN() || T.isSPIROrSPIRV()); - // FIXME: Eliminate this dependency. unsigned Opt = getOptimizationLevel(Args, IK, Diags), OptSize = getOptimizationLevelSize(Args); diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 1a816cb6269d4..863b9c14b6d4f 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -1564,9 +1564,7 @@ void clang::InitializePreprocessor(Preprocessor &PP, if (InitOpts.UsePredefines) { // FIXME: This will create multiple definitions for most of the predefined // macros. This is not the right way to handle this. - if ((LangOpts.CUDA || LangOpts.OpenMPIsTargetDevice || - LangOpts.SYCLIsDevice) && - PP.getAuxTargetInfo()) + if ((LangOpts.CUDA || LangOpts.isTargetDevice()) && PP.getAuxTargetInfo()) InitializePredefinedMacros(*PP.getAuxTargetInfo(), LangOpts, FEOpts, PP.getPreprocessorOpts(), Builder); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 36de02d91e151..20e1b478761e5 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7854,8 +7854,7 @@ NamedDecl *Sema::ActOnVariableDeclarator( diag::err_thread_non_global) << DeclSpec::getSpecifierName(TSCS); else if (!Context.getTargetInfo().isTLSSupported()) { - if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || - getLangOpts().SYCLIsDevice) { + if (getLangOpts().CUDA || getLangOpts().isTargetDevice()) { // Postpone error emission until we've collected attributes required to // figure out whether it's a host or device variable and whether the // error should be ignored. @@ -7986,8 +7985,7 @@ NamedDecl *Sema::ActOnVariableDeclarator( if (const auto *TT = R->getAs<TypedefType>()) copyAttrFromTypedefToDecl<AllocSizeAttr>(*this, NewVD, TT); - if (getLangOpts().CUDA || getLangOpts().OpenMPIsTargetDevice || - getLangOpts().SYCLIsDevice) { + if (getLangOpts().CUDA || getLangOpts().isTargetDevice()) { if (EmitTLSUnsupportedError && ((getLangOpts().CUDA && DeclAttrsMatchCUDAMode(getLangOpts(), NewVD)) || (getLangOpts().OpenMPIsTargetDevice && @@ -16554,9 +16552,8 @@ Decl *Sema::ActOnFinishFunctionBody(Decl *dcl, Stmt *Body, DiscardCleanupsInEvaluationContext(); } - if (FD && ((LangOpts.OpenMP && (LangOpts.OpenMPIsTargetDevice || - !LangOpts.OMPTargetTriples.empty())) || - LangOpts.CUDA || LangOpts.SYCLIsDevice)) { + if (FD && (LangOpts.isTargetDevice() || LangOpts.CUDA || + (LangOpts.OpenMP && !LangOpts.OMPTargetTriples.empty()))) { auto ES = getEmissionStatus(FD); if (ES == Sema::FunctionEmissionStatus::Emitted || ES == Sema::FunctionEmissionStatus::Unknown) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 0f115a6f04509..ad287f2989fce 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1122,7 +1122,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { } case DeclSpec::TST_int128: if (!S.Context.getTargetInfo().hasInt128Type() && - !(S.getLangOpts().isOffloadingTarget())) + !(S.getLangOpts().isTargetDevice())) S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << "__int128"; if (DS.getTypeSpecSign() == TypeSpecifierSign::Unsigned) @@ -1167,7 +1167,7 @@ static QualType ConvertDeclSpecToType(TypeProcessingState &state) { break; case DeclSpec::TST_float128: if (!S.Context.getTargetInfo().hasFloat128Type() && - !S.getLangOpts().isOffloadingTarget()) + !S.getLangOpts().isTargetDevice()) S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) << "__float128"; Result = Context.Float128Ty; @@ -8360,7 +8360,7 @@ static bool verifyValidIntegerConstantExpr(Sema &S, const ParsedAttr &Attr, /// match one of the standard Neon vector types. static void HandleNeonVectorTypeAttr(QualType &CurType, const ParsedAttr &Attr, Sema &S, VectorKind VecKind) { - bool IsTargetOffloading = S.getLangOpts().isOffloadingTarget(); + bool IsTargetOffloading = S.getLangOpts().isTargetDevice(); // Target must have NEON (or MVE, whose vectors are similar enough // not to need a separate attribute) diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 7db8f3e27d704..b38aca051dac2 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -508,7 +508,7 @@ Expected<StringRef> clang(ArrayRef<StringRef> InputFiles, const ArgList &Args) { CmdArgs.push_back(InputFile); // If this is CPU offloading we copy the input libraries. - if (!Triple.isAMDGPU() && !Triple.isNVPTX() && !Triple.isSPIRV()) { + if (!Triple.isGPU()) { CmdArgs.push_back("-Wl,-Bsymbolic"); CmdArgs.push_back("-shared"); ArgStringList LinkerArgs; diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 8b07a50824899..aea975a427f0b 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1126,22 +1126,17 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, if (args.hasArg(clang::driver::options::OPT_no_offloadlib)) res.getLangOpts().NoGPULib = 1; } - - switch (llvm::Triple(res.getTargetOpts().triple).getArch()) { - case llvm::Triple::nvptx: - case llvm::Triple::nvptx64: - case llvm::Triple::amdgcn: + if (llvm::Triple(res.getTargetOpts().triple).isGPU()) { if (!res.getLangOpts().OpenMPIsTargetDevice) { const unsigned diagID = diags.getCustomDiagID( clang::DiagnosticsEngine::Error, - "OpenMP AMDGPU/NVPTX is only prepared to deal with device code."); + "OpenMP GPU is only prepared to deal with device code."); diags.Report(diagID); } res.getLangOpts().OpenMPIsGPU = 1; - break; - default: - res.getLangOpts().OpenMPIsGPU = 0; - break; + else { + res.getLangOpts().OpenMPIsGPU = 0; + } } // Get the OpenMP target triples if any. @@ -1163,11 +1158,8 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, if (tt.getArch() == llvm::Triple::UnknownArch || !(tt.getArch() == llvm::Triple::aarch64 || tt.isPPC() || tt.getArch() == llvm::Triple::systemz || - tt.getArch() == llvm::Triple::nvptx || - tt.getArch() == llvm::Triple::nvptx64 || - tt.getArch() == llvm::Triple::amdgcn || tt.getArch() == llvm::Triple::x86 || - tt.getArch() == llvm::Triple::x86_64)) + tt.getArch() == llvm::Triple::x86_64 || tt.isGPU())) diags.Report(clang::diag::err_drv_invalid_omp_target) << arg->getValue(i); else if (getArchPtrSize(t) != getArchPtrSize(tt)) diff --git a/llvm/include/llvm/TargetParser/Triple.h b/llvm/include/llvm/TargetParser/Triple.h index 09c0d223d9b4d..a68bd032fe846 100644 --- a/llvm/include/llvm/TargetParser/Triple.h +++ b/llvm/include/llvm/TargetParser/Triple.h @@ -1218,6 +1218,9 @@ class Triple { /// Test whether target triples are compatible. bool isCompatibleWith(const Triple &Other) const; + /// Test whether the target triple is for a GPU. + bool isGPU() const { return isSPIRV() || isNVPTX() || isAMDGPU(); } + /// Merge target triples. std::string merge(const Triple &Other) const; diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h index 05951f87b5062..543926fe76f61 100644 --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -1339,9 +1339,7 @@ struct InformationCache { bool stackIsAccessibleByOtherThreads() { return !targetIsGPU(); } /// Return true if the target is a GPU. - bool targetIsGPU() { - return TargetTriple.isAMDGPU() || TargetTriple.isNVPTX(); - } + bool targetIsGPU() { return TargetTriple.isGPU(); } /// Return all functions that might be called indirectly, only valid for /// closed world modules (see isClosedWorldModule). diff --git a/llvm/lib/ProfileData/InstrProf.cpp b/llvm/lib/ProfileData/InstrProf.cpp index 47eb751328b51..b39c34dbc128e 100644 --- a/llvm/lib/ProfileData/InstrProf.cpp +++ b/llvm/lib/ProfileData/InstrProf.cpp @@ -439,7 +439,7 @@ std::string getPGOFuncNameVarName(StringRef FuncName, bool isGPUProfTarget(const Module &M) { const auto &T = Triple(M.getTargetTriple()); - return T.isAMDGPU() || T.isNVPTX(); + return T.isGPU(); } void setPGOFuncVisibility(Module &M, GlobalVariable *FuncNameVar) { diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp index c29a5e53b82ea..dd8328ff805d6 100644 --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -199,7 +199,7 @@ ChangeStatus &llvm::operator&=(ChangeStatus &L, ChangeStatus R) { bool AA::isGPU(const Module &M) { Triple T(M.getTargetTriple()); - return T.isAMDGPU() || T.isNVPTX(); + return T.isGPU(); } bool AA::isNoSyncInst(Attributor &A, const Instruction &I, @@ -3301,7 +3301,7 @@ InformationCache::getIndirectlyCallableFunctions(Attributor &A) const { } std::optional<unsigned> InformationCache::getFlatAddressSpace() const { - if (TargetTriple.isAMDGPU() || TargetTriple.isNVPTX()) + if (TargetTriple.isGPU()) return 0; return std::nullopt; } diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp index 9ebc235f58142..270ba309e14dd 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp @@ -133,8 +133,7 @@ class SanitizerBinaryMetadata { VersionStr(utostr(getVersion())), IRB(M.getContext()) { // FIXME: Make it work with other formats. assert(TargetTriple.isOSBinFormatELF() && "ELF only"); - assert(!(TargetTriple.isNVPTX() || TargetTriple.isAMDGPU()) && - "Device targets are not supported"); + assert(!TargetTriple.isGPU() && "Device targets are not supported"); } bool run(); >From 3167b3f644a4518e8eb779054f1d2404080503bd Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Fri, 21 Mar 2025 12:09:38 -0700 Subject: [PATCH 3/4] remove newline Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- clang/lib/Driver/ToolChains/Clang.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d603dab7076d9..cf95cf0af8f5b 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -6388,7 +6388,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, addPGOAndCoverageFlags(TC, C, JA, Output, Args, SanitizeArgs, CmdArgs); - Args.AddLastArg(CmdArgs, options::OPT_fclang_abi_compat_EQ); if (getLastProfileSampleUseArg(Args) && >From 3224283266e64d0913873c5d358326365d6020a4 Mon Sep 17 00:00:00 2001 From: "Sarnie, Nick" <nick.sar...@intel.com> Date: Mon, 24 Mar 2025 08:29:20 -0700 Subject: [PATCH 4/4] flang fixes Signed-off-by: Sarnie, Nick <nick.sar...@intel.com> --- flang/lib/Frontend/CompilerInvocation.cpp | 5 ++--- flang/test/Lower/OpenMP/omp-is-gpu.f90 | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 7d902fc92c226..376ae0c34c399 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1144,9 +1144,8 @@ static bool parseOpenMPArgs(CompilerInvocation &res, llvm::opt::ArgList &args, diags.Report(diagID); } res.getLangOpts().OpenMPIsGPU = 1; - else { - res.getLangOpts().OpenMPIsGPU = 0; - } + } else { + res.getLangOpts().OpenMPIsGPU = 0; } // Get the OpenMP target triples if any. diff --git a/flang/test/Lower/OpenMP/omp-is-gpu.f90 b/flang/test/Lower/OpenMP/omp-is-gpu.f90 index 3e6daeb522d77..77d347c9a9fde 100644 --- a/flang/test/Lower/OpenMP/omp-is-gpu.f90 +++ b/flang/test/Lower/OpenMP/omp-is-gpu.f90 @@ -12,5 +12,5 @@ subroutine omp_subroutine() end subroutine omp_subroutine -!FLANG-ERROR: error: OpenMP AMDGPU/NVPTX is only prepared to deal with device code. +!FLANG-ERROR: error: OpenMP GPU is only prepared to deal with device code. !BBC-ERROR: FATAL: -fopenmp-is-gpu can only be set if -fopenmp-is-target-device is also set _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits