[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
MaskRay requested changes to this revision. MaskRay added inline comments. This revision now requires changes to proceed. Comment at: clang/lib/Driver/ToolChains/UEFI.cpp:68 + // "Terminal Service Aware" flag is not needed for UEFI applications. + CmdArgs.push_back("-tsaware:no"); + These options are not tested. Comment at: clang/test/Driver/uefi.c:4 +// RUN: | FileCheck -check-prefixes=CHECK %s +// RUN: %clang -### %s --target=x86_64-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ This RUN line is not needed. If you want to check that x86_64-uefi normalizes to unknown, you can add a unittest instead. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
phosek accepted this revision. phosek added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
Prabhuk updated this revision to Diff 557372. Prabhuk added a comment. Removed IsIntegratedAssemblerDefault. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 Files: clang/lib/Basic/Targets.cpp clang/lib/Basic/Targets/OSTargets.h clang/lib/Basic/Targets/X86.h clang/lib/Driver/CMakeLists.txt clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/UEFI.cpp clang/lib/Driver/ToolChains/UEFI.h clang/test/Driver/uefi.c Index: clang/test/Driver/uefi.c === --- /dev/null +++ clang/test/Driver/uefi.c @@ -0,0 +1,10 @@ +// RUN: %clang -### %s --target=x86_64-unknown-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// RUN: %clang -### %s --target=x86_64-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// CHECK: "-cc1" +// CHECK-SAME: "-triple" "x86_64-unknown-uefi" +// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2" +// CHECK-SAME: "-mframe-pointer=all" Index: clang/lib/Driver/ToolChains/UEFI.h === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.h @@ -0,0 +1,61 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace tools { +namespace uefi { +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { +public: + Linker(const ToolChain &TC) : Tool("uefi::Linker", "lld-link", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation &C, const JobAction &JA, +const InputInfo &Output, const InputInfoList &Inputs, +const llvm::opt::ArgList &TCArgs, +const char *LinkingOutput) const override; +}; +} // end namespace uefi +} // end namespace tools + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY UEFI : public ToolChain { +public: + UEFI(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + +protected: + Tool *buildLinker() const override; + +public: + bool HasNativeLLVMSupport() const override { return true; } + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { +return UnwindTableLevel::Asynchronous; + } + bool isPICDefault() const override { return true; } + bool isPIEDefault(const llvm::opt::ArgList &Args) const override { +return false; + } + bool isPICDefaultForced() const override { return true; } +}; + +} // namespace toolchains +} // namespace driver +} // namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H Index: clang/lib/Driver/ToolChains/UEFI.cpp === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.cpp @@ -0,0 +1,115 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#include "UEFI.h" +#include "CommonArgs.h" +#include "Darwin.h" +#include "clang/Basic/CharInfo.h" +#include "clang/Basic/Version.h" +#include "clang/Config/config.h" +#include "clang/Driver/Compilation.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/Host.h" + +using namespace clang::driver; +using namespace clang::driver::toolchains; +using namespace clang; +using namespace llvm::opt; + +UEFI::UEFI(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) +: ToolChain(D, Triple, Args) { + getProgramPaths().push_back(getDriver().getInstalledDir()); + if (getDriver().getInstalledDir() != getDriver().Dir) +getProgramPaths().push_back(getDriver().Dir); +} + +Tool *UEFI::buildLinker() const { return new tools::uefi::Linker(*this); } + +voi
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
brad added inline comments. Comment at: clang/lib/Driver/ToolChains/UEFI.h:46 + bool HasNativeLLVMSupport() const override { return true; } + bool IsIntegratedAssemblerDefault() const override { return true; } + UnwindTableLevel Remove the IsIntegratedAssemblerDefault entry. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
Prabhuk updated this revision to Diff 557227. Prabhuk added a comment. Addressed review comments about the inline comments. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 Files: clang/lib/Basic/Targets.cpp clang/lib/Basic/Targets/OSTargets.h clang/lib/Basic/Targets/X86.h clang/lib/Driver/CMakeLists.txt clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/UEFI.cpp clang/lib/Driver/ToolChains/UEFI.h clang/test/Driver/uefi.c Index: clang/test/Driver/uefi.c === --- /dev/null +++ clang/test/Driver/uefi.c @@ -0,0 +1,10 @@ +// RUN: %clang -### %s --target=x86_64-unknown-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// RUN: %clang -### %s --target=x86_64-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// CHECK: "-cc1" +// CHECK-SAME: "-triple" "x86_64-unknown-uefi" +// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2" +// CHECK-SAME: "-mframe-pointer=all" Index: clang/lib/Driver/ToolChains/UEFI.h === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.h @@ -0,0 +1,62 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace tools { +namespace uefi { +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { +public: + Linker(const ToolChain &TC) : Tool("uefi::Linker", "lld-link", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation &C, const JobAction &JA, +const InputInfo &Output, const InputInfoList &Inputs, +const llvm::opt::ArgList &TCArgs, +const char *LinkingOutput) const override; +}; +} // end namespace uefi +} // end namespace tools + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY UEFI : public ToolChain { +public: + UEFI(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + +protected: + Tool *buildLinker() const override; + +public: + bool HasNativeLLVMSupport() const override { return true; } + bool IsIntegratedAssemblerDefault() const override { return true; } + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { +return UnwindTableLevel::Asynchronous; + } + bool isPICDefault() const override { return true; } + bool isPIEDefault(const llvm::opt::ArgList &Args) const override { +return false; + } + bool isPICDefaultForced() const override { return true; } +}; + +} // namespace toolchains +} // namespace driver +} // namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H Index: clang/lib/Driver/ToolChains/UEFI.cpp === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.cpp @@ -0,0 +1,115 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#include "UEFI.h" +#include "CommonArgs.h" +#include "Darwin.h" +#include "clang/Basic/CharInfo.h" +#include "clang/Basic/Version.h" +#include "clang/Config/config.h" +#include "clang/Driver/Compilation.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/Host.h" + +using namespace clang::driver; +using namespace clang::driver::toolchains; +using namespace clang; +using namespace llvm::opt; + +UEFI::UEFI(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) +: ToolChain(D, Triple, Args) { + getProgramPaths().push_back(getDriver().getInstalledDir()); + if (getDriver().getInstalledDir() != getDriver().Dir) +getProgramPaths().push_back(getDriver().Dir); +
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
phosek added inline comments. Comment at: clang/lib/Driver/ToolChains/UEFI.cpp:58-59 + + // Other UEFI binary subsystems that are currently unsupported: + // efi_boot_service_driver, efi_rom, efi_runtime_driver. + CmdArgs.push_back("-subsystem:efi_application"); Comment at: clang/lib/Driver/ToolChains/UEFI.cpp:62-64 + // Default entry function name according to the TianaCore reference + // implementation is EfiMain. In the future we will add a flag to override the + // entry function name. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D159541/new/ https://reviews.llvm.org/D159541 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D159541: [UEFI] X86_64 UEFI Clang Driver
Prabhuk created this revision. Prabhuk added a reviewer: phosek. Herald added a subscriber: pengfei. Herald added a project: All. Prabhuk requested review of this revision. Herald added subscribers: cfe-commits, MaskRay. Herald added a project: clang. Introduce changes necessary for UEFI X86_64 target Clang driver. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D159541 Files: clang/lib/Basic/Targets.cpp clang/lib/Basic/Targets/OSTargets.h clang/lib/Basic/Targets/X86.h clang/lib/Driver/CMakeLists.txt clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/UEFI.cpp clang/lib/Driver/ToolChains/UEFI.h clang/test/Driver/uefi.c Index: clang/test/Driver/uefi.c === --- /dev/null +++ clang/test/Driver/uefi.c @@ -0,0 +1,10 @@ +// RUN: %clang -### %s --target=x86_64-unknown-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// RUN: %clang -### %s --target=x86_64-uefi \ +// RUN: --sysroot=%S/platform -fuse-ld=lld 2>&1 \ +// RUN: | FileCheck -check-prefixes=CHECK %s +// CHECK: "-cc1" +// CHECK-SAME: "-triple" "x86_64-unknown-uefi" +// CHECK-SAME: "-mrelocation-model" "pic" "-pic-level" "2" +// CHECK-SAME: "-mframe-pointer=all" Index: clang/lib/Driver/ToolChains/UEFI.h === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.h @@ -0,0 +1,62 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H + +#include "clang/Driver/Tool.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace tools { +namespace uefi { +class LLVM_LIBRARY_VISIBILITY Linker : public Tool { +public: + Linker(const ToolChain &TC) : Tool("uefi::Linker", "lld-link", TC) {} + + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + + void ConstructJob(Compilation &C, const JobAction &JA, +const InputInfo &Output, const InputInfoList &Inputs, +const llvm::opt::ArgList &TCArgs, +const char *LinkingOutput) const override; +}; +} // end namespace uefi +} // end namespace tools + +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY UEFI : public ToolChain { +public: + UEFI(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + +protected: + Tool *buildLinker() const override; + +public: + bool HasNativeLLVMSupport() const override { return true; } + bool IsIntegratedAssemblerDefault() const override { return true; } + UnwindTableLevel + getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { +return UnwindTableLevel::Asynchronous; + } + bool isPICDefault() const override { return true; } + bool isPIEDefault(const llvm::opt::ArgList &Args) const override { +return false; + } + bool isPICDefaultForced() const override { return true; } +}; + +} // namespace toolchains +} // namespace driver +} // namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_UEFI_H Index: clang/lib/Driver/ToolChains/UEFI.cpp === --- /dev/null +++ clang/lib/Driver/ToolChains/UEFI.cpp @@ -0,0 +1,115 @@ +//===--- UEFI.h - UEFI ToolChain Implementations --*- 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 +// +//===--===// + +#include "UEFI.h" +#include "CommonArgs.h" +#include "Darwin.h" +#include "clang/Basic/CharInfo.h" +#include "clang/Basic/Version.h" +#include "clang/Config/config.h" +#include "clang/Driver/Compilation.h" +#include "clang/Driver/Driver.h" +#include "clang/Driver/Options.h" +#include "clang/Driver/SanitizerArgs.h" +#include "llvm/ADT/StringExtras.h" +#include "llvm/ADT/StringSwitch.h" +#include "llvm/Option/Arg.h" +#include "llvm/Option/ArgList.h" +#include "llvm/Support/FileSystem.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/VirtualFileSystem.h" +#include "llvm/TargetParser/Host.h" + +using namespace clang::driver; +using namespace clang::driver::toolchains; +using namespace clang; +using namespace llvm::opt; + +UEFI::UEFI(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) +: ToolChain(D, Triple, Args) { + getProgramPaths().push_back(getDriver().get