[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
This revision was automatically updated to reflect the committed changes. Closed by commit rL310798: [AArch64] Add support for a MinGW AArch64 target (authored by mstorsjo). Changed prior to commit: https://reviews.llvm.org/D36364?vs=109935=110886#toc Repository: rL LLVM https://reviews.llvm.org/D36364 Files: cfe/trunk/lib/Basic/Targets.cpp cfe/trunk/lib/Basic/Targets/AArch64.cpp cfe/trunk/lib/Basic/Targets/AArch64.h cfe/trunk/lib/Driver/ToolChains/CrossWindows.cpp cfe/trunk/lib/Driver/ToolChains/MinGW.cpp cfe/trunk/test/Preprocessor/predefined-macros.c Index: cfe/trunk/lib/Driver/ToolChains/CrossWindows.cpp === --- cfe/trunk/lib/Driver/ToolChains/CrossWindows.cpp +++ cfe/trunk/lib/Driver/ToolChains/CrossWindows.cpp @@ -36,6 +36,7 @@ llvm_unreachable("unsupported architecture"); case llvm::Triple::arm: case llvm::Triple::thumb: + case llvm::Triple::aarch64: break; case llvm::Triple::x86: CmdArgs.push_back("--32"); @@ -98,6 +99,9 @@ // FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; case llvm::Triple::x86: CmdArgs.push_back("i386pe"); EntryPoint.append("_"); @@ -111,6 +115,7 @@ switch (T.getArch()) { default: llvm_unreachable("unsupported architecture"); +case llvm::Triple::aarch64: case llvm::Triple::arm: case llvm::Triple::thumb: case llvm::Triple::x86_64: Index: cfe/trunk/lib/Driver/ToolChains/MinGW.cpp === --- cfe/trunk/lib/Driver/ToolChains/MinGW.cpp +++ cfe/trunk/lib/Driver/ToolChains/MinGW.cpp @@ -119,12 +119,24 @@ CmdArgs.push_back("-s"); CmdArgs.push_back("-m"); - if (TC.getArch() == llvm::Triple::x86) + switch (TC.getArch()) { + case llvm::Triple::x86: CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) +break; + case llvm::Triple::x86_64: CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) +break; + case llvm::Triple::arm: + case llvm::Triple::thumb: +// FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); +break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; + default: +llvm_unreachable("Unsupported target architecture."); + } if (Args.hasArg(options::OPT_mwindows)) { CmdArgs.push_back("--subsystem"); Index: cfe/trunk/lib/Basic/Targets/AArch64.h === --- cfe/trunk/lib/Basic/Targets/AArch64.h +++ cfe/trunk/lib/Basic/Targets/AArch64.h @@ -89,24 +89,42 @@ void setDataLayout() override; }; -class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo : public WindowsTargetInfo { const llvm::Triple Triple; public: - MicrosoftARM64TargetInfo(const llvm::Triple , - const TargetOptions ); + WindowsARM64TargetInfo(const llvm::Triple , + const TargetOptions ); void setDataLayout() override; + BuiltinVaListKind getBuiltinVaListKind() const override; + + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; +}; + +// Windows ARM, MS (C++) ABI +class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MicrosoftARM64TargetInfo(const llvm::Triple , + const TargetOptions ); + void getVisualStudioDefines(const LangOptions , MacroBuilder ) const; void getTargetDefines(const LangOptions , MacroBuilder ) const override; +}; - BuiltinVaListKind getBuiltinVaListKind() const override; +// ARM64 MinGW target +class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MinGWARM64TargetInfo(const llvm::Triple , const TargetOptions ); - CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; + void getTargetDefines(const LangOptions , +MacroBuilder ) const override; }; class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { Index: cfe/trunk/lib/Basic/Targets/AArch64.cpp === --- cfe/trunk/lib/Basic/Targets/AArch64.cpp +++ cfe/trunk/lib/Basic/Targets/AArch64.cpp @@ -414,8 +414,8 @@ resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"); } -MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(const llvm::Triple , - const TargetOptions ) +WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple , + const TargetOptions ) : WindowsTargetInfo(Triple, Opts), Triple(Triple) { // This is an
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
compnerd accepted this revision. compnerd added a comment. Yeah, I think that this is okay. https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo added a comment. @compnerd - are you ok with this one as well? https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
martell accepted this revision. martell added a comment. This revision is now accepted and ready to land. LGTM https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo updated this revision to Diff 109935. mstorsjo added a comment. Added a fixme comment about this being incorrect for WinCE. https://reviews.llvm.org/D36364 Files: lib/Basic/Targets.cpp lib/Basic/Targets/AArch64.cpp lib/Basic/Targets/AArch64.h lib/Driver/ToolChains/CrossWindows.cpp lib/Driver/ToolChains/MinGW.cpp test/Preprocessor/predefined-macros.c Index: test/Preprocessor/predefined-macros.c === --- test/Preprocessor/predefined-macros.c +++ test/Preprocessor/predefined-macros.c @@ -199,3 +199,13 @@ // CHECK-ARM64-WIN: #define _M_ARM64 1 // CHECK-ARM64-WIN: #define _WIN32 1 // CHECK-ARM64-WIN: #define _WIN64 1 + +// RUN: %clang_cc1 -triple aarch64-windows-gnu %s -E -dM -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-ARM64-MINGW + +// CHECK-ARM64-MINGW-NOT: #define _M_ARM64 1 +// CHECK-ARM64-MINGW: #define WIN32 1 +// CHECK-ARM64-MINGW: #define WIN64 1 +// CHECK-ARM64-MINGW: #define _WIN32 1 +// CHECK-ARM64-MINGW: #define _WIN64 1 +// CHECK-ARM64-MINGW: #define __aarch64__ 1 Index: lib/Driver/ToolChains/MinGW.cpp === --- lib/Driver/ToolChains/MinGW.cpp +++ lib/Driver/ToolChains/MinGW.cpp @@ -119,12 +119,24 @@ CmdArgs.push_back("-s"); CmdArgs.push_back("-m"); - if (TC.getArch() == llvm::Triple::x86) + switch (TC.getArch()) { + case llvm::Triple::x86: CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) +break; + case llvm::Triple::x86_64: CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) +break; + case llvm::Triple::arm: + case llvm::Triple::thumb: +// FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); +break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; + default: +llvm_unreachable("Unsupported target architecture."); + } if (Args.hasArg(options::OPT_mwindows)) { CmdArgs.push_back("--subsystem"); Index: lib/Driver/ToolChains/CrossWindows.cpp === --- lib/Driver/ToolChains/CrossWindows.cpp +++ lib/Driver/ToolChains/CrossWindows.cpp @@ -36,6 +36,7 @@ llvm_unreachable("unsupported architecture"); case llvm::Triple::arm: case llvm::Triple::thumb: + case llvm::Triple::aarch64: break; case llvm::Triple::x86: CmdArgs.push_back("--32"); @@ -98,6 +99,9 @@ // FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; case llvm::Triple::x86: CmdArgs.push_back("i386pe"); EntryPoint.append("_"); @@ -111,6 +115,7 @@ switch (T.getArch()) { default: llvm_unreachable("unsupported architecture"); +case llvm::Triple::aarch64: case llvm::Triple::arm: case llvm::Triple::thumb: case llvm::Triple::x86_64: Index: lib/Basic/Targets/AArch64.h === --- lib/Basic/Targets/AArch64.h +++ lib/Basic/Targets/AArch64.h @@ -89,24 +89,42 @@ void setDataLayout() override; }; -class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo : public WindowsTargetInfo { const llvm::Triple Triple; public: - MicrosoftARM64TargetInfo(const llvm::Triple , - const TargetOptions ); + WindowsARM64TargetInfo(const llvm::Triple , + const TargetOptions ); void setDataLayout() override; + BuiltinVaListKind getBuiltinVaListKind() const override; + + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; +}; + +// Windows ARM, MS (C++) ABI +class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MicrosoftARM64TargetInfo(const llvm::Triple , + const TargetOptions ); + void getVisualStudioDefines(const LangOptions , MacroBuilder ) const; void getTargetDefines(const LangOptions , MacroBuilder ) const override; +}; - BuiltinVaListKind getBuiltinVaListKind() const override; +// ARM64 MinGW target +class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MinGWARM64TargetInfo(const llvm::Triple , const TargetOptions ); - CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; + void getTargetDefines(const LangOptions , +MacroBuilder ) const override; }; class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { Index: lib/Basic/Targets/AArch64.cpp === --- lib/Basic/Targets/AArch64.cpp +++ lib/Basic/Targets/AArch64.cpp @@ -414,8 +414,8 @@
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:130 + case llvm::Triple::arm: + case llvm::Triple::thumb: CmdArgs.push_back("thumb2pe"); martell wrote: > I believe this was left incase someone wanted to do windows ce in future. > Can you add a todo like in CrossWindows.cpp in this case > `// FIXME: this is incorrect for WinCE` > or if we don't care about WinCE anymore just remove the TODO from > CrossWindows? Sure, I can add a todo. I wanted to add it, since technically, the modern windows on arm stuff is thumb, we should handle it if the user uses the triple thumbv7-windows-gnu (iirc, some of the tests do). https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
martell added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:130 + case llvm::Triple::arm: + case llvm::Triple::thumb: CmdArgs.push_back("thumb2pe"); I believe this was left incase someone wanted to do windows ce in future. Can you add a todo like in CrossWindows.cpp in this case `// FIXME: this is incorrect for WinCE` or if we don't care about WinCE anymore just remove the TODO from CrossWindows? https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
martell added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:129 + else if (TC.getArch() == llvm::Triple::aarch64) +CmdArgs.push_back("arm64pe"); + else mstorsjo wrote: > martell wrote: > > I believe the reason I used thumb2pe for the arm triple is because MS gave > > us a watered down thumb environment. > > If I remember correctly there was also an armce environment in binutils > > called thumbpe because it was thumb 1 mode. > > Anyway, I assume aarch64 on windows is a fully fledged arm64 environment > > that doesn't use thumb mode over arm64? > > I know we don't have any real sdk for this but are you able to tell from > > link.exe martin? > > On arm the branch for a dll call would always set the bit for thumb mode in > > the instruction. > > Although when I think about it arm64pe is probably the most suitable name > > anyway because we already use thumb2pe > > > There's no thumb mode at all in 64 bit mode (yet at least), so naming it > thumb* wouldn't make sense. Modelling the previous name after the old thumbpe > makes sense though. Great, thanks. Just wanted to clarify because we never had a discussion about the naming. LGTM https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:129 + else if (TC.getArch() == llvm::Triple::aarch64) +CmdArgs.push_back("arm64pe"); + else martell wrote: > I believe the reason I used thumb2pe for the arm triple is because MS gave us > a watered down thumb environment. > If I remember correctly there was also an armce environment in binutils > called thumbpe because it was thumb 1 mode. > Anyway, I assume aarch64 on windows is a fully fledged arm64 environment that > doesn't use thumb mode over arm64? > I know we don't have any real sdk for this but are you able to tell from > link.exe martin? > On arm the branch for a dll call would always set the bit for thumb mode in > the instruction. > Although when I think about it arm64pe is probably the most suitable name > anyway because we already use thumb2pe > There's no thumb mode at all in 64 bit mode (yet at least), so naming it thumb* wouldn't make sense. Modelling the previous name after the old thumbpe makes sense though. https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo updated this revision to Diff 109916. mstorsjo added a comment. Updated to use a switch, added a mapping of a missed case of thumb while reformatting the if to a switch. https://reviews.llvm.org/D36364 Files: lib/Basic/Targets.cpp lib/Basic/Targets/AArch64.cpp lib/Basic/Targets/AArch64.h lib/Driver/ToolChains/CrossWindows.cpp lib/Driver/ToolChains/MinGW.cpp test/Preprocessor/predefined-macros.c Index: test/Preprocessor/predefined-macros.c === --- test/Preprocessor/predefined-macros.c +++ test/Preprocessor/predefined-macros.c @@ -199,3 +199,13 @@ // CHECK-ARM64-WIN: #define _M_ARM64 1 // CHECK-ARM64-WIN: #define _WIN32 1 // CHECK-ARM64-WIN: #define _WIN64 1 + +// RUN: %clang_cc1 -triple aarch64-windows-gnu %s -E -dM -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-ARM64-MINGW + +// CHECK-ARM64-MINGW-NOT: #define _M_ARM64 1 +// CHECK-ARM64-MINGW: #define WIN32 1 +// CHECK-ARM64-MINGW: #define WIN64 1 +// CHECK-ARM64-MINGW: #define _WIN32 1 +// CHECK-ARM64-MINGW: #define _WIN64 1 +// CHECK-ARM64-MINGW: #define __aarch64__ 1 Index: lib/Driver/ToolChains/MinGW.cpp === --- lib/Driver/ToolChains/MinGW.cpp +++ lib/Driver/ToolChains/MinGW.cpp @@ -119,12 +119,23 @@ CmdArgs.push_back("-s"); CmdArgs.push_back("-m"); - if (TC.getArch() == llvm::Triple::x86) + switch (TC.getArch()) { + case llvm::Triple::x86: CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) +break; + case llvm::Triple::x86_64: CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) +break; + case llvm::Triple::arm: + case llvm::Triple::thumb: CmdArgs.push_back("thumb2pe"); +break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; + default: +llvm_unreachable("Unsupported target architecture."); + } if (Args.hasArg(options::OPT_mwindows)) { CmdArgs.push_back("--subsystem"); Index: lib/Driver/ToolChains/CrossWindows.cpp === --- lib/Driver/ToolChains/CrossWindows.cpp +++ lib/Driver/ToolChains/CrossWindows.cpp @@ -36,6 +36,7 @@ llvm_unreachable("unsupported architecture"); case llvm::Triple::arm: case llvm::Triple::thumb: + case llvm::Triple::aarch64: break; case llvm::Triple::x86: CmdArgs.push_back("--32"); @@ -98,6 +99,9 @@ // FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; case llvm::Triple::x86: CmdArgs.push_back("i386pe"); EntryPoint.append("_"); @@ -111,6 +115,7 @@ switch (T.getArch()) { default: llvm_unreachable("unsupported architecture"); +case llvm::Triple::aarch64: case llvm::Triple::arm: case llvm::Triple::thumb: case llvm::Triple::x86_64: Index: lib/Basic/Targets/AArch64.h === --- lib/Basic/Targets/AArch64.h +++ lib/Basic/Targets/AArch64.h @@ -89,24 +89,42 @@ void setDataLayout() override; }; -class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo : public WindowsTargetInfo { const llvm::Triple Triple; public: - MicrosoftARM64TargetInfo(const llvm::Triple , - const TargetOptions ); + WindowsARM64TargetInfo(const llvm::Triple , + const TargetOptions ); void setDataLayout() override; + BuiltinVaListKind getBuiltinVaListKind() const override; + + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; +}; + +// Windows ARM, MS (C++) ABI +class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MicrosoftARM64TargetInfo(const llvm::Triple , + const TargetOptions ); + void getVisualStudioDefines(const LangOptions , MacroBuilder ) const; void getTargetDefines(const LangOptions , MacroBuilder ) const override; +}; - BuiltinVaListKind getBuiltinVaListKind() const override; +// ARM64 MinGW target +class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MinGWARM64TargetInfo(const llvm::Triple , const TargetOptions ); - CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; + void getTargetDefines(const LangOptions , +MacroBuilder ) const override; }; class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { Index: lib/Basic/Targets/AArch64.cpp === --- lib/Basic/Targets/AArch64.cpp +++ lib/Basic/Targets/AArch64.cpp @@ -414,8 +414,8 @@
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
martell added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:129 + else if (TC.getArch() == llvm::Triple::aarch64) +CmdArgs.push_back("arm64pe"); + else I believe the reason I used thumb2pe for the arm triple is because MS gave us a watered down thumb environment. If I remember correctly there was also an armce environment in binutils called thumbpe because it was thumb 1 mode. Anyway, I assume aarch64 on windows is a fully fledged arm64 environment that doesn't use thumb mode over arm64? I know we don't have any real sdk for this but are you able to tell from link.exe martin? On arm the branch for a dll call would always set the bit for thumb mode in the instruction. Although when I think about it arm64pe is probably the most suitable name anyway because we already use thumb2pe https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:122-131 if (TC.getArch() == llvm::Triple::x86) CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) + else if (TC.getArch() == llvm::Triple::x86_64) CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) + else if (TC.getArch() == llvm::Triple::arm) CmdArgs.push_back("thumb2pe"); + else if (TC.getArch() == llvm::Triple::aarch64) compnerd wrote: > Can you use a switch here instead? Sure, I can change that. What do you think about the `llvm_unreachable` part btw? There's nothing stopping a user from trigger that with e.g. `-target mips-windows-gnu`, and in release builds, such a `default: llvm_unreachable()` case usually ends up as just running one of the existing cases. Should it be changed into a real runtime error that isn't optimized out from release builds? https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
compnerd added inline comments. Comment at: lib/Driver/ToolChains/MinGW.cpp:122-131 if (TC.getArch() == llvm::Triple::x86) CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) + else if (TC.getArch() == llvm::Triple::x86_64) CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) + else if (TC.getArch() == llvm::Triple::arm) CmdArgs.push_back("thumb2pe"); + else if (TC.getArch() == llvm::Triple::aarch64) Can you use a switch here instead? https://reviews.llvm.org/D36364 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D36364: [AArch64] Add support for a MinGW AArch64 target
mstorsjo created this revision. Herald added subscribers: kristof.beyls, javed.absar, rengolin, aemerson. The machine name `arm64pe` passed to the linker is completely made up; gnu binutils doesn't (afaik) support this, so it only has to match what the corresponding (not yet merged) lld linker supports - similarly to the existing `thumb2pe` machine name. https://reviews.llvm.org/D36364 Files: lib/Basic/Targets.cpp lib/Basic/Targets/AArch64.cpp lib/Basic/Targets/AArch64.h lib/Driver/ToolChains/CrossWindows.cpp lib/Driver/ToolChains/MinGW.cpp test/Preprocessor/predefined-macros.c Index: test/Preprocessor/predefined-macros.c === --- test/Preprocessor/predefined-macros.c +++ test/Preprocessor/predefined-macros.c @@ -199,3 +199,13 @@ // CHECK-ARM64-WIN: #define _M_ARM64 1 // CHECK-ARM64-WIN: #define _WIN32 1 // CHECK-ARM64-WIN: #define _WIN64 1 + +// RUN: %clang_cc1 -triple aarch64-windows-gnu %s -E -dM -o - \ +// RUN: | FileCheck -match-full-lines %s --check-prefix=CHECK-ARM64-MINGW + +// CHECK-ARM64-MINGW-NOT: #define _M_ARM64 1 +// CHECK-ARM64-MINGW: #define WIN32 1 +// CHECK-ARM64-MINGW: #define WIN64 1 +// CHECK-ARM64-MINGW: #define _WIN32 1 +// CHECK-ARM64-MINGW: #define _WIN64 1 +// CHECK-ARM64-MINGW: #define __aarch64__ 1 Index: lib/Driver/ToolChains/MinGW.cpp === --- lib/Driver/ToolChains/MinGW.cpp +++ lib/Driver/ToolChains/MinGW.cpp @@ -121,10 +121,14 @@ CmdArgs.push_back("-m"); if (TC.getArch() == llvm::Triple::x86) CmdArgs.push_back("i386pe"); - if (TC.getArch() == llvm::Triple::x86_64) + else if (TC.getArch() == llvm::Triple::x86_64) CmdArgs.push_back("i386pep"); - if (TC.getArch() == llvm::Triple::arm) + else if (TC.getArch() == llvm::Triple::arm) CmdArgs.push_back("thumb2pe"); + else if (TC.getArch() == llvm::Triple::aarch64) +CmdArgs.push_back("arm64pe"); + else +llvm_unreachable("Unsupported target architecture."); if (Args.hasArg(options::OPT_mwindows)) { CmdArgs.push_back("--subsystem"); Index: lib/Driver/ToolChains/CrossWindows.cpp === --- lib/Driver/ToolChains/CrossWindows.cpp +++ lib/Driver/ToolChains/CrossWindows.cpp @@ -36,6 +36,7 @@ llvm_unreachable("unsupported architecture"); case llvm::Triple::arm: case llvm::Triple::thumb: + case llvm::Triple::aarch64: break; case llvm::Triple::x86: CmdArgs.push_back("--32"); @@ -98,6 +99,9 @@ // FIXME: this is incorrect for WinCE CmdArgs.push_back("thumb2pe"); break; + case llvm::Triple::aarch64: +CmdArgs.push_back("arm64pe"); +break; case llvm::Triple::x86: CmdArgs.push_back("i386pe"); EntryPoint.append("_"); @@ -111,6 +115,7 @@ switch (T.getArch()) { default: llvm_unreachable("unsupported architecture"); +case llvm::Triple::aarch64: case llvm::Triple::arm: case llvm::Triple::thumb: case llvm::Triple::x86_64: Index: lib/Basic/Targets/AArch64.h === --- lib/Basic/Targets/AArch64.h +++ lib/Basic/Targets/AArch64.h @@ -89,24 +89,42 @@ void setDataLayout() override; }; -class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo : public WindowsTargetInfo { const llvm::Triple Triple; public: - MicrosoftARM64TargetInfo(const llvm::Triple , - const TargetOptions ); + WindowsARM64TargetInfo(const llvm::Triple , + const TargetOptions ); void setDataLayout() override; + BuiltinVaListKind getBuiltinVaListKind() const override; + + CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; +}; + +// Windows ARM, MS (C++) ABI +class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MicrosoftARM64TargetInfo(const llvm::Triple , + const TargetOptions ); + void getVisualStudioDefines(const LangOptions , MacroBuilder ) const; void getTargetDefines(const LangOptions , MacroBuilder ) const override; +}; - BuiltinVaListKind getBuiltinVaListKind() const override; +// ARM64 MinGW target +class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo +: public WindowsARM64TargetInfo { +public: + MinGWARM64TargetInfo(const llvm::Triple , const TargetOptions ); - CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; + void getTargetDefines(const LangOptions , +MacroBuilder ) const override; }; class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo { Index: lib/Basic/Targets/AArch64.cpp === --- lib/Basic/Targets/AArch64.cpp +++