diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 843559f202abe..675645cd534ed 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -426,7 +426,7 @@ ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NormalInlining) VALUE_CODEGENOPT(InlineMaxStackSize, 32, UINT_MAX) // Vector functions library to use. -ENUM_CODEGENOPT(VecLib, VectorLibrary, 3, NoLibrary) +ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) /// The default TLS model to use. ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel) diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h index c8e2544f891cc..b202d01af0ed6 100644 --- a/clang/include/clang/Basic/CodeGenOptions.h +++ b/clang/include/clang/Basic/CodeGenOptions.h @@ -17,6 +17,7 @@ #include "clang/Basic/XRayInstr.h" #include "llvm/ADT/FloatingPointMode.h" #include "llvm/Frontend/Debug/Options.h" +#include "llvm/Frontend/Driver/CodeGenOptions.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Regex.h" #include "llvm/Target/TargetOptions.h" @@ -58,17 +59,6 @@ class CodeGenOptions : public CodeGenOptionsBase { OnlyAlwaysInlining // Only run the always inlining pass. }; - enum VectorLibrary { - NoLibrary, // Don't use any vector library. - Accelerate, // Use the Accelerate framework. - LIBMVEC, // GLIBC vector math library. - MASSV, // IBM MASS vector library. - SVML, // Intel short vector math library. - SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions. - Darwin_libsystem_m, // Use Darwin's libsytem_m vector functions. - ArmPL // Arm Performance Libraries. - }; - enum ObjCDispatchMethodKind { Legacy = 0, NonLegacy = 1, diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index dacc4442b338a..d1b67a448b2a5 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -3126,10 +3126,10 @@ def fno_global_isel : Flag<["-"], "fno-global-isel">, Group, def fno_experimental_isel : Flag<["-"], "fno-experimental-isel">, Group, Alias; def fveclib : Joined<["-"], "fveclib=">, Group, - Visibility<[ClangOption, CC1Option]>, + Visibility<[ClangOption, CC1Option, FlangOption, FC1Option]>, HelpText<"Use the given vector functions library">, Values<"Accelerate,libmvec,MASSV,SVML,SLEEF,Darwin_libsystem_m,ArmPL,none">, - NormalizedValuesScope<"CodeGenOptions">, + NormalizedValuesScope<"llvm::driver::VectorLibrary">, NormalizedValues<["Accelerate", "LIBMVEC", "MASSV", "SVML", "SLEEF", "Darwin_libsystem_m", "ArmPL", "NoLibrary"]>, MarshallingInfoEnum, "NoLibrary">; diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index adcfe8c7bfcd1..a7a47d17723cb 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -29,6 +29,7 @@ #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/Frontend/Driver/CodeGenOptions.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/LegacyPassManager.h" @@ -264,45 +265,6 @@ static bool asanUseGlobalsGC(const Triple &T, const CodeGenOptions &CGOpts) { return false; } -static TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple, - const CodeGenOptions &CodeGenOpts) { - TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple); - - switch (CodeGenOpts.getVecLib()) { - case CodeGenOptions::Accelerate: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate, - TargetTriple); - break; - case CodeGenOptions::LIBMVEC: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86, - TargetTriple); - break; - case CodeGenOptions::MASSV: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV, - TargetTriple); - break; - case CodeGenOptions::SVML: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML, - TargetTriple); - break; - case CodeGenOptions::SLEEF: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI, - TargetTriple); - break; - case CodeGenOptions::Darwin_libsystem_m: - TLII->addVectorizableFunctionsFromVecLib( - TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple); - break; - case CodeGenOptions::ArmPL: - TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::ArmPL, - TargetTriple); - break; - default: - break; - } - return TLII; -} - static std::optional getCodeModel(const CodeGenOptions &CodeGenOpts) { unsigned CodeModel = llvm::StringSwitch(CodeGenOpts.CodeModel) @@ -590,7 +552,7 @@ bool EmitAssemblyHelper::AddEmitPasses(legacy::PassManager &CodeGenPasses, raw_pwrite_stream *DwoOS) { // Add LibraryInfo. std::unique_ptr TLII( - createTLII(TargetTriple, CodeGenOpts)); + llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib())); CodeGenPasses.add(new TargetLibraryInfoWrapperPass(*TLII)); // Normal mode, emit a .s or .o file by running the code generator. Note, @@ -923,7 +885,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline( // Register the target library analysis directly and give it a customized // preset TLI. std::unique_ptr TLII( - createTLII(TargetTriple, CodeGenOpts)); + llvm::driver::createTLII(TargetTriple, CodeGenOpts.getVecLib())); FAM.registerPass([&] { return TargetLibraryAnalysis(*TLII); }); // Register all the basic analyses with the managers. diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index b807af9379731..52216d93a302b 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -9,6 +9,7 @@ set(LLVM_LINK_COMPONENTS Coverage Demangle Extensions + FrontendDriver FrontendHLSL FrontendOpenMP FrontendOffloading diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index ce0f7e4da006d..8bdd920c3dcbb 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -233,6 +233,40 @@ void Flang::addTargetOptions(const ArgList &Args, break; } + if (Arg *A = Args.getLastArg(options::OPT_fveclib)) { + StringRef Name = A->getValue(); + if (Name == "SVML") { + if (Triple.getArch() != llvm::Triple::x86 && + Triple.getArch() != llvm::Triple::x86_64) + D.Diag(diag::err_drv_unsupported_opt_for_target) + << Name << Triple.getArchName(); + } else if (Name == "LIBMVEC-X86") { + if (Triple.getArch() != llvm::Triple::x86 && + Triple.getArch() != llvm::Triple::x86_64) + D.Diag(diag::err_drv_unsupported_opt_for_target) + << Name << Triple.getArchName(); + } else if (Name == "SLEEF" || Name == "ArmPL") { + if (Triple.getArch() != llvm::Triple::aarch64 && + Triple.getArch() != llvm::Triple::aarch64_be) + D.Diag(diag::err_drv_unsupported_opt_for_target) + << Name << Triple.getArchName(); + } + + if (Triple.isOSDarwin()) { + // flang doesn't currently suport nostdlib, nodefaultlibs. Adding these + // here incase they are added someday + if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { + if (A->getValue() == StringRef{"Accelerate"}) { + CmdArgs.push_back("-framework"); + CmdArgs.push_back("Accelerate"); + A->render(Args, CmdArgs); + } + } + } else { + A->render(Args, CmdArgs); + } + } + // TODO: Add target specific flags, ABI, mtune option etc. } diff --git a/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp b/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp index f48fbb0f3c6ad..1529bfa75d6d5 100644 --- a/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp +++ b/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp @@ -111,7 +111,7 @@ int main(int argc, const char **argv) { auto Files = llvm::makeIntrusiveRefCnt(FileSystemOptions(), OFS); - auto Driver = std::make_unique( + auto Driver = std::make_unique( "clang", llvm::sys::getDefaultTargetTriple(), Diagnostics, "ast-api-dump-tool", OFS); @@ -121,14 +121,14 @@ int main(int argc, const char **argv) { return 1; const auto &Jobs = Comp->getJobs(); - if (Jobs.size() != 1 || !isa(*Jobs.begin())) { + if (Jobs.size() != 1 || !isa(*Jobs.begin())) { SmallString<256> error_msg; llvm::raw_svector_ostream error_stream(error_msg); Jobs.Print(error_stream, "; ", true); return 1; } - const auto &Cmd = cast(*Jobs.begin()); + const auto &Cmd = cast(*Jobs.begin()); const llvm::opt::ArgStringList &CC1Args = Cmd.getArguments(); auto Invocation = std::make_unique(); diff --git a/flang/include/flang/Frontend/CodeGenOptions.def b/flang/include/flang/Frontend/CodeGenOptions.def index 1e350869f1377..72e7bdab12a14 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.def +++ b/flang/include/flang/Frontend/CodeGenOptions.def @@ -37,6 +37,7 @@ CODEGENOPT(AliasAnalysis, 1, 0) ///< Enable alias analysis pass CODEGENOPT(Underscoring, 1, 1) ENUM_CODEGENOPT(RelocationModel, llvm::Reloc::Model, 3, llvm::Reloc::PIC_) ///< Name of the relocation model to use. ENUM_CODEGENOPT(DebugInfo, llvm::codegenoptions::DebugInfoKind, 4, llvm::codegenoptions::NoDebugInfo) ///< Level of debug info to generate +ENUM_CODEGENOPT(VecLib, llvm::driver::VectorLibrary, 3, llvm::driver::VectorLibrary::NoLibrary) ///< Vector functions library to use #undef CODEGENOPT #undef ENUM_CODEGENOPT diff --git a/flang/include/flang/Frontend/CodeGenOptions.h b/flang/include/flang/Frontend/CodeGenOptions.h index b0e0c91e09ab3..a3c39bda10667 100644 --- a/flang/include/flang/Frontend/CodeGenOptions.h +++ b/flang/include/flang/Frontend/CodeGenOptions.h @@ -16,6 +16,7 @@ #define LLVM_CLANG_BASIC_CODEGENOPTIONS_H #include "llvm/Frontend/Debug/Options.h" +#include "llvm/Frontend/Driver/CodeGenOptions.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Regex.h" #include "llvm/Target/TargetOptions.h" diff --git a/flang/lib/Frontend/CMakeLists.txt b/flang/lib/Frontend/CMakeLists.txt index a06b610112f20..1eba37f4573f6 100644 --- a/flang/lib/Frontend/CMakeLists.txt +++ b/flang/lib/Frontend/CMakeLists.txt @@ -52,6 +52,7 @@ add_flang_library(flangFrontend Support Target TargetParser + FrontendDriver FrontendOpenACC FrontendOpenMP diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 3fef3771ed0da..334da3ac287e3 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -153,6 +153,34 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts, return true; } +static bool parseVectorLibArg(Fortran::frontend::CodeGenOptions &opts, + llvm::opt::ArgList &args, + clang::DiagnosticsEngine &diags) { + llvm::opt::Arg *arg = args.getLastArg(clang::driver::options::OPT_fveclib); + if (!arg) + return true; + + using VectorLibrary = llvm::driver::VectorLibrary; + std::optional val = + llvm::StringSwitch>(arg->getValue()) + .Case("Accelerate", VectorLibrary::Accelerate) + .Case("LIBMVEC", VectorLibrary::LIBMVEC) + .Case("MASSV", VectorLibrary::MASSV) + .Case("SVML", VectorLibrary::SVML) + .Case("SLEEF", VectorLibrary::SLEEF) + .Case("Darwin_libsystem_m", VectorLibrary::Darwin_libsystem_m) + .Case("ArmPL", VectorLibrary::ArmPL) + .Case("NoLibrary", VectorLibrary::NoLibrary) + .Default(std::nullopt); + if (!val.has_value()) { + diags.Report(clang::diag::err_drv_invalid_value) + << arg->getAsString(args) << arg->getValue(); + return false; + } + opts.setVecLib(val.value()); + return true; +} + // Generate an OptRemark object containing info on if the -Rgroup // specified is enabled or not. static CodeGenOptions::OptRemark @@ -1116,6 +1144,7 @@ bool CompilerInvocation::createFromArgs( parsePreprocessorArgs(res.getPreprocessorOpts(), args); parseCodeGenArgs(res.getCodeGenOpts(), args, diags); success &= parseDebugArgs(res.getCodeGenOpts(), args, diags); + success &= parseVectorLibArg(res.getCodeGenOpts(), args, diags); success &= parseSemaArgs(res, args, diags); success &= parseDialectArgs(res, args, diags); success &= parseDiagArgs(res, args, diags); diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp index 73c00c8679c7e..d7ca7b66584dd 100644 --- a/flang/lib/Frontend/FrontendActions.cpp +++ b/flang/lib/Frontend/FrontendActions.cpp @@ -850,11 +850,13 @@ getOutputStream(CompilerInstance &ci, llvm::StringRef inFile, /// \param [in] tm Target machine to aid the code-gen pipeline set-up /// \param [in] act Backend act to run (assembly vs machine-code generation) /// \param [in] llvmModule LLVM module to lower to assembly/machine-code +/// \param [in] codeGenOpts options configuring codegen pipeline /// \param [out] os Output stream to emit the generated code to static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags, llvm::TargetMachine &tm, BackendActionTy act, llvm::Module &llvmModule, + const CodeGenOptions &codeGenOpts, llvm::raw_pwrite_stream &os) { assert(((act == BackendActionTy::Backend_EmitObj) || (act == BackendActionTy::Backend_EmitAssembly)) && @@ -868,9 +870,8 @@ static void generateMachineCodeOrAssemblyImpl(clang::DiagnosticsEngine &diags, createTargetTransformInfoWrapperPass(tm.getTargetIRAnalysis())); llvm::Triple triple(llvmModule.getTargetTriple()); - std::unique_ptr tlii = - std::make_unique(triple); - assert(tlii && "Failed to create TargetLibraryInfo"); + llvm::TargetLibraryInfoImpl *tlii = + llvm::driver::createTLII(triple, codeGenOpts.getVecLib()); codeGenPasses.add(new llvm::TargetLibraryInfoWrapperPass(*tlii)); llvm::CodeGenFileType cgft = (act == BackendActionTy::Backend_EmitAssembly) @@ -923,6 +924,13 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) { get##Ext##PluginInfo().RegisterPassBuilderCallbacks(pb); #include "llvm/Support/Extension.def" + // Register the target library analysis directly and give it a customized + // preset TLI depending on -fveclib + llvm::Triple triple(llvmModule->getTargetTriple()); + llvm::TargetLibraryInfoImpl *tlii = + llvm::driver::createTLII(triple, opts.getVecLib()); + fam.registerPass([&] { return llvm::TargetLibraryAnalysis(*tlii); }); + // Register all the basic analyses with the managers. pb.registerModuleAnalyses(mam); pb.registerCGSCCAnalyses(cgam); @@ -1227,7 +1235,7 @@ void CodeGenAction::executeAction() { if (action == BackendActionTy::Backend_EmitAssembly || action == BackendActionTy::Backend_EmitObj) { generateMachineCodeOrAssemblyImpl( - diags, *tm, action, *llvmModule, + diags, *tm, action, *llvmModule, codeGenOpts, ci.isOutputStreamNull() ? *os : ci.getOutputStream()); return; } diff --git a/flang/test/Driver/driver-help-hidden.f90 b/flang/test/Driver/driver-help-hidden.f90 index bd04ffae231b6..b276f1906e1a4 100644 --- a/flang/test/Driver/driver-help-hidden.f90 +++ b/flang/test/Driver/driver-help-hidden.f90 @@ -102,6 +102,7 @@ ! CHECK-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size ! CHECK-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages ! CHECK-NEXT: -funderscoring Appends one trailing underscore to external names +! CHECK-NEXT: -fveclib= Use the given vector functions library ! CHECK-NEXT: -fversion-loops-for-stride ! CHECK-NEXT: Create unit-strided versions of loops ! CHECK-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. diff --git a/flang/test/Driver/driver-help.f90 b/flang/test/Driver/driver-help.f90 index 2f81ec260ec96..ea9c892bd6210 100644 --- a/flang/test/Driver/driver-help.f90 +++ b/flang/test/Driver/driver-help.f90 @@ -88,6 +88,7 @@ ! HELP-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size ! HELP-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages ! HELP-NEXT: -funderscoring Appends one trailing underscore to external names +! HELP-NEXT: -fveclib= Use the given vector functions library ! HELP-NEXT: -fversion-loops-for-stride ! HELP-NEXT: Create unit-strided versions of loops ! HELP-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. @@ -222,6 +223,7 @@ ! HELP-FC1-NEXT: -fstack-arrays Attempt to allocate array temporaries on the stack, no matter their size ! HELP-FC1-NEXT: -fsyntax-only Run the preprocessor, parser and semantic analysis stages ! HELP-FC1-NEXT: -funderscoring Appends one trailing underscore to external names +! HELP-FC1-NEXT: -fveclib= Use the given vector functions library ! HELP-FC1-NEXT: -fversion-loops-for-stride ! HELP-FC1-NEXT: Create unit-strided versions of loops ! HELP-FC1-NEXT: -fxor-operator Enable .XOR. as a synonym of .NEQV. diff --git a/flang/test/Driver/fveclib-codegen.f90 b/flang/test/Driver/fveclib-codegen.f90 new file mode 100644 index 0000000000000..8d7d3af1e8f9b --- /dev/null +++ b/flang/test/Driver/fveclib-codegen.f90 @@ -0,0 +1,15 @@ +! test that -fveclib= is passed to the backend +! -target aarch64 so that ArmPL is available +! RUN: %flang -S -Ofast -fveclib=LIBMVEC -o - %s | FileCheck %s +! RUN: %flang -S -Ofast -fveclib=NoLibrary -o - %s | FileCheck %s --check-prefix=NOLIB + +subroutine sb(a, b) + real :: a(:), b(:) + integer :: i + do i=1,100 +! check that we used a vectorized call to powf() +! CHECK: _ZGVbN4vv_powf +! NOLIB: powf + a(i) = a(i) ** b(i) + end do +end subroutine diff --git a/flang/test/Driver/fveclib.f90 b/flang/test/Driver/fveclib.f90 new file mode 100644 index 0000000000000..898c65b0c850a --- /dev/null +++ b/flang/test/Driver/fveclib.f90 @@ -0,0 +1,30 @@ +! RUN: %flang -### -c -fveclib=none %s 2>&1 | FileCheck -check-prefix CHECK-NOLIB %s +! RUN: %flang -### -c -fveclib=Accelerate %s 2>&1 | FileCheck -check-prefix CHECK-ACCELERATE %s +! RUN: %flang -### -c -fveclib=libmvec %s 2>&1 | FileCheck -check-prefix CHECK-libmvec %s +! RUN: %flang -### -c -fveclib=MASSV %s 2>&1 | FileCheck -check-prefix CHECK-MASSV %s +! RUN: %flang -### -c -fveclib=Darwin_libsystem_m %s 2>&1 | FileCheck -check-prefix CHECK-DARWIN_LIBSYSTEM_M %s +! RUN: %flang -### -c --target=aarch64-none-none -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-SLEEF %s +! RUN: %flang -### -c --target=aarch64-none-none -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ARMPL %s +! RUN: not %flang -c -fveclib=something %s 2>&1 | FileCheck -check-prefix CHECK-INVALID %s + +! CHECK-NOLIB: "-fveclib=none" +! CHECK-ACCELERATE: "-fveclib=Accelerate" +! CHECK-libmvec: "-fveclib=libmvec" +! CHECK-MASSV: "-fveclib=MASSV" +! CHECK-DARWIN_LIBSYSTEM_M: "-fveclib=Darwin_libsystem_m" +! CHECK-SLEEF: "-fveclib=SLEEF" +! CHECK-ARMPL: "-fveclib=ArmPL" + +! CHECK-INVALID: error: invalid value 'something' in '-fveclib=something' + +! RUN: not %flang --target=x86-none-none -c -fveclib=SLEEF %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s +! RUN: not %flang --target=x86-none-none -c -fveclib=ArmPL %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s +! RUN: not %flang --target=aarch64-none-none -c -fveclib=LIBMVEC-X86 %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s +! RUN: not %flang --target=aarch64-none-none -c -fveclib=SVML %s 2>&1 | FileCheck -check-prefix CHECK-ERROR %s +! CHECK-ERROR: unsupported option {{.*}} for target + +! RUN: %flang -fveclib=Accelerate %s -target arm64-apple-ios8.0.0 -### 2>&1 | FileCheck --check-prefix=CHECK-LINK %s +! CHECK-LINK: "-framework" "Accelerate" + +! TODO: if we add support for -nostdlib or -nodefaultlibs we need to test that +! these prevent "-framework Accelerate" being added on Darwin diff --git a/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h new file mode 100644 index 0000000000000..0b1d924a26b2d --- /dev/null +++ b/llvm/include/llvm/Frontend/Driver/CodeGenOptions.h @@ -0,0 +1,40 @@ +//===--- CodeGenOptions.h ---------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file defines frontend codegen options common to clang and flang +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_FRONTEND_DRIVER_CODEGENOPTIONS_H +#define LLVM_FRONTEND_DRIVER_CODEGENOPTIONS_H + +namespace llvm { +class Triple; +class TargetLibraryInfoImpl; +} // namespace llvm + +namespace llvm::driver { + +/// Vector library option used with -fveclib= +enum class VectorLibrary { + NoLibrary, // Don't use any vector library. + Accelerate, // Use the Accelerate framework. + LIBMVEC, // GLIBC vector math library. + MASSV, // IBM MASS vector library. + SVML, // Intel short vector math library. + SLEEF, // SLEEF SIMD Library for Evaluating Elementary Functions. + Darwin_libsystem_m, // Use Darwin's libsystem_m vector functions. + ArmPL // Arm Performance Libraries. +}; + +TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple, + VectorLibrary Veclib); + +} // end namespace llvm::driver + +#endif diff --git a/llvm/lib/Frontend/CMakeLists.txt b/llvm/lib/Frontend/CMakeLists.txt index 5ef092e0a1a9e..62dd0da1e6c2d 100644 --- a/llvm/lib/Frontend/CMakeLists.txt +++ b/llvm/lib/Frontend/CMakeLists.txt @@ -1,3 +1,4 @@ +add_subdirectory(Driver) add_subdirectory(HLSL) add_subdirectory(OpenACC) add_subdirectory(OpenMP) diff --git a/llvm/lib/Frontend/Driver/CMakeLists.txt b/llvm/lib/Frontend/Driver/CMakeLists.txt new file mode 100644 index 0000000000000..23de4994a300d --- /dev/null +++ b/llvm/lib/Frontend/Driver/CMakeLists.txt @@ -0,0 +1,15 @@ +add_llvm_component_library(LLVMFrontendDriver + CodeGenOptions.cpp + + ADDITIONAL_HEADER_DIRS + ${LLVM_MAIN_INCLUDE_DIR}/llvm/Frontend/Driver + + DEPENDS + LLVMAnalysis + LLVMTargetParser + + LINK_COMPONENTS + Core + Support + Analysis + ) diff --git a/llvm/lib/Frontend/Driver/CodeGenOptions.cpp b/llvm/lib/Frontend/Driver/CodeGenOptions.cpp new file mode 100644 index 0000000000000..96c5b19a4a591 --- /dev/null +++ b/llvm/lib/Frontend/Driver/CodeGenOptions.cpp @@ -0,0 +1,55 @@ +//===--- CodeGenOptions.cpp - Shared codegen option handling --------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Frontend/Driver/CodeGenOptions.h" +#include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/TargetParser/Triple.h" + +namespace llvm::driver { + +TargetLibraryInfoImpl *createTLII(llvm::Triple &TargetTriple, + driver::VectorLibrary Veclib) { + TargetLibraryInfoImpl *TLII = new TargetLibraryInfoImpl(TargetTriple); + + using VectorLibrary = llvm::driver::VectorLibrary; + switch (Veclib) { + case VectorLibrary::Accelerate: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::Accelerate, + TargetTriple); + break; + case VectorLibrary::LIBMVEC: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::LIBMVEC_X86, + TargetTriple); + break; + case VectorLibrary::MASSV: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::MASSV, + TargetTriple); + break; + case VectorLibrary::SVML: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SVML, + TargetTriple); + break; + case VectorLibrary::SLEEF: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::SLEEFGNUABI, + TargetTriple); + break; + case VectorLibrary::Darwin_libsystem_m: + TLII->addVectorizableFunctionsFromVecLib( + TargetLibraryInfoImpl::DarwinLibSystemM, TargetTriple); + break; + case VectorLibrary::ArmPL: + TLII->addVectorizableFunctionsFromVecLib(TargetLibraryInfoImpl::ArmPL, + TargetTriple); + break; + default: + break; + } + return TLII; +} + +} // namespace llvm::driver