[clang] [clang] [MinGW] Don't look for a GCC in path if the install base has a proper mingw sysroot (PR #76949)

2024-01-04 Thread Jacek Caban via cfe-commits

cjacek wrote:

Looks mostly good to me, but I wonder if we should change testTriple as well.

https://github.com/llvm/llvm-project/pull/76949
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] [MinGW] Don't look for a GCC in path if the install base has a proper mingw sysroot (PR #76949)

2024-01-05 Thread Jacek Caban via cfe-commits

cjacek wrote:

> Although, on a second thought, it might actually still be good to adjust it 
> in sync. If we're invoking Clang with `-m32` and deciding on whether to use 
> i386/i586/i686, and we end up using the install base as sysroot, without 
> inferring any triple from there, we shouldn't go on and check another 
> unrelated GCC in path in order to influence this. Therefore, I think we 
> perhaps should amend this with the following:

Yes, I think that it would be better to avoid any decisions based on an 
unrelated GCC and the additional check looks good to me.

https://github.com/llvm/llvm-project/pull/76949
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] [MinGW] Don't look for a GCC in path if the install base has a proper mingw sysroot (PR #76949)

2024-01-05 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.


https://github.com/llvm/llvm-project/pull/76949
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][Driver] Pass -machine argument to the linker explicitly for ARM64EC targets. (PR #86835)

2024-03-27 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/86835

Currently, Clang doesn't explicitly pass the `-machine` argument to the linker, 
relying on the linker to infer it from the input. However, MSVC's link.exe 
requires `-machine` to be specified explicitly for ARM64EC/ARM64X targets. 
Although lld-link allows inferring the target from ARM64EC object files, this 
detection isn't entirely reliable as AMD64 object files are also valid input 
for ARM64EC target.

Handling of `-machine:arm64ec` is straightforward. For ARM64X, this PR extends 
the ARM64EC target triple to accept the "arm64x" subarch string, which serves 
as an alias to "arm64ec" in most cases. However, during linker invocation, 
"arm64x" distinguishes between `-machine:arm64ec` and `-machine:arm64x`.

The only analogue to MSVC's behavior is `cl.exe -arm64EC`, which is handled by 
`-machine:arm64ec` part of this PR. As far as I can tell, linking ARM64X images 
with MSVC requires a direct link.exe invocation. In cases like lib.exe (#85972) 
or some
aspects of link.exe, `-machine:arm64x` serves as an alias to `-machine:arm64ec` 
too.

(BTW, meantime, I worked around it with `-Wl,-machine:...`).
CC @bylaws 

>From 9f045fd8fa59ef11e2308c7d75b4f08c35c05c16 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Mon, 19 Feb 2024 00:39:50 +0100
Subject: [PATCH] [clang][Driver] Pass -machine argument to the linker
 explicitly for ARM64EC targets.

Currently, Clang doesn't explicitly pass the -machine argument to the linker, 
relying
on the linker to infer it from the input. However, MSVC's link.exe requires 
-machine
to be specified explicitly for ARM64EC/ARM64X targets. Although lld-link allows
inferring the target from ARM64EC object files, this detection isn't entirely 
reliable
as AMD64 object files are also valid input for ARM64EC target.

Handling of -machine:arm64ec is straightforward. For ARM64X, this PR extends the
ARM64EC target triple to accept the "arm64x" subarch string, which serves as an 
alias
to "arm64ec" in most cases. However, during linker invocation, "arm64x" 
distinguishes
between -machine:arm64ec and -machine:arm64x.

The only analogue to MSVC's behavior is cl.exe -arm64EC, which is handled by
-machine:arm64ec part of this PR. As far as I can tell, linking ARM64X images 
with
MSVC requires a direct link.exe invocation. In cases like lib.exe (#85972) or 
some
aspects of link.exe, -machine:arm64x serves as an alias to -machine:arm64ec too.
---
 clang/lib/Driver/Driver.cpp|  3 +--
 clang/lib/Driver/ToolChains/MSVC.cpp   |  7 ++
 clang/test/Driver/msvc-link.c  |  6 ++
 llvm/include/llvm/TargetParser/Triple.h|  4 +++-
 llvm/lib/TargetParser/Triple.cpp   |  9 
 llvm/unittests/TargetParser/TripleTest.cpp | 25 ++
 6 files changed, 47 insertions(+), 7 deletions(-)

diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 7a53764364ce4d..328ea93b679293 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1458,8 +1458,7 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) {
   }
 
   // Report warning when arm64EC option is overridden by specified target
-  if ((TC.getTriple().getArch() != llvm::Triple::aarch64 ||
-   TC.getTriple().getSubArch() != llvm::Triple::AArch64SubArch_arm64ec) &&
+  if (!TC.getTriple().isWindowsArm64EC() &&
   UArgs->hasArg(options::OPT__SLASH_arm64EC)) {
 getDiags().Report(clang::diag::warn_target_override_arm64ec)
 << TC.getTriple().str();
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index dc534a33e6d0ef..edf81ce7e425be 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -79,6 +79,13 @@ void visualstudio::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
 CmdArgs.push_back(
 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
 
+  if (TC.getTriple().isWindowsArm64EC()) {
+if (TC.getTriple().getSubArch() == llvm::Triple::AArch64SubArch_arm64x)
+  CmdArgs.push_back("-machine:arm64x");
+else
+  CmdArgs.push_back("-machine:arm64ec");
+  }
+
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
   !C.getDriver().IsCLMode() && !C.getDriver().IsFlangMode()) {
 CmdArgs.push_back("-defaultlib:libcmt");
diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index 64e099ea63042f..03ba3cd5805188 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -36,3 +36,9 @@
 // VFSOVERLAY: "--vfsoverlay"
 // VFSOVERLAY: lld-link
 // VFSOVERLAY: "/vfsoverlay:{{.*}}" "{{.*}}.obj"
+
+// RUN: %clang -target arm64ec-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64EC %s
+// ARM64EC: "-machine:arm64ec"
+
+// RUN: %clang -target arm64x-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64X %s
+// ARM64X: "-mac

[clang] [clang][Driver] Pass -machine argument to the linker explicitly for ARM64EC targets. (PR #86835)

2024-03-28 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/86835

>From 7a4a69076b2172e50ce305f97e0f97f67d00aa32 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Thu, 28 Mar 2024 14:58:48 +0100
Subject: [PATCH] [clang][Driver] Pass -machine argument to the linker
 explicitly for ARM64EC targets.

---
 clang/include/clang/Driver/Options.td |  3 +++
 clang/lib/Driver/ToolChains/MSVC.cpp  |  8 
 clang/test/Driver/msvc-link.c | 20 
 3 files changed, 31 insertions(+)

diff --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 29066ea14280c2..39c932e72fdefd 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -4507,6 +4507,9 @@ def mwindows : Joined<["-"], "mwindows">, Group;
 def mdll : Joined<["-"], "mdll">, Group;
 def municode : Joined<["-"], "municode">, Group;
 def mthreads : Joined<["-"], "mthreads">, Group;
+def marm64x : Joined<["-"], "marm64x">, Group,
+  Visibility<[ClangOption, CLOption]>,
+  HelpText<"Link as a hybrid ARM64X image">;
 def mguard_EQ : Joined<["-"], "mguard=">, Group,
   HelpText<"Enable or disable Control Flow Guard checks and guard tables 
emission">,
   Values<"none,cf,cf-nochecks">;
diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp 
b/clang/lib/Driver/ToolChains/MSVC.cpp
index dc534a33e6d0ef..fbf2f45b543844 100644
--- a/clang/lib/Driver/ToolChains/MSVC.cpp
+++ b/clang/lib/Driver/ToolChains/MSVC.cpp
@@ -79,6 +79,11 @@ void visualstudio::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
 CmdArgs.push_back(
 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
 
+  if (Args.hasArg(options::OPT_marm64x))
+CmdArgs.push_back("-machine:arm64x");
+  else if (TC.getTriple().isWindowsArm64EC())
+CmdArgs.push_back("-machine:arm64ec");
+
   if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
   !C.getDriver().IsCLMode() && !C.getDriver().IsFlangMode()) {
 CmdArgs.push_back("-defaultlib:libcmt");
@@ -1017,4 +1022,7 @@ void MSVCToolChain::addClangTargetOptions(
   if (DriverArgs.hasFlag(options::OPT_fno_rtti, options::OPT_frtti,
  /*Default=*/false))
 CC1Args.push_back("-D_HAS_STATIC_RTTI=0");
+
+  if (Arg *A = DriverArgs.getLastArgNoClaim(options::OPT_marm64x))
+A->ignoreTargetSpecific();
 }
diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index 64e099ea63042f..f80b043c6cfce2 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -36,3 +36,23 @@
 // VFSOVERLAY: "--vfsoverlay"
 // VFSOVERLAY: lld-link
 // VFSOVERLAY: "/vfsoverlay:{{.*}}" "{{.*}}.obj"
+
+// RUN: %clang -target arm64ec-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64EC %s
+// RUN: %clang_cl -target arm64ec-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64EC %s
+// RUN: %clang_cl -arm64EC -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64EC %s
+// ARM64EC: "-machine:arm64ec"
+
+// RUN: %clang -target arm64ec-pc-windows-msvc -fuse-ld=link -marm64x -### %s 
2>&1 | \
+// RUN:FileCheck --check-prefix=ARM64X %s
+// RUN: %clang -target aarch64-pc-windows-msvc -fuse-ld=link -marm64x -### %s 
2>&1 | \
+// RUN:FileCheck --check-prefix=ARM64X %s
+// RUN: %clang_cl -marm64x -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
+// RUN: %clang_cl -arm64EC -marm64x -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
+// ARM64X: "-machine:arm64x"
+
+// RUN: not %clang -target x86_64-linux-gnu -marm64x -### %s 2>&1 | FileCheck 
--check-prefix=HYBRID-ERR %s
+// HYBRID-ERR: error: unsupported option '-marm64x' for target 
'x86_64-linux-gnu'
+
+// RUN: %clang -c -marm64x  -target arm64ec-pc-windows-msvc -fuse-ld=link -### 
%s 2>&1 | \
+// RUN:FileCheck --check-prefix=HYBRID-WARN %s
+// HYBRID-WARN: warning: argument unused during compilation: '-marm64x' 
[-Wunused-command-line-argument]

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Driver] Pass -machine argument to the linker explicitly for ARM64EC targets. (PR #86835)

2024-03-28 Thread Jacek Caban via cfe-commits

cjacek wrote:

Sounds good to me, the new version uses `-marm64x` flag instead. Thanks.

https://github.com/llvm/llvm-project/pull/86835
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][Driver] Pass -machine argument to the linker explicitly for ARM64EC targets. (PR #86835)

2024-03-30 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed https://github.com/llvm/llvm-project/pull/86835
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][NFC] Fix ARM64EC clang-cl linker driver tests. (PR #87160)

2024-03-30 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/87160

Add '--' argument to clang-cl to avoid interpreting input files with /U option. 
Fix for llvm-clang-aarch64-darwin buildbot failure after #86835.

>From 2808ce015e4d025164c635d75795c714babe4f05 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 30 Mar 2024 17:11:45 +0100
Subject: [PATCH] [clang][NFC] Fix ARM64EC clang-cl linker driver tests.

Add '--' argument to clang-cl to avoid interpreting input files with /U option.
Fix for llvm-clang-aarch64-darwin buildbot failure after #86835.
---
 clang/test/Driver/msvc-link.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/test/Driver/msvc-link.c b/clang/test/Driver/msvc-link.c
index f80b043c6cfce2..b5c32b17378522 100644
--- a/clang/test/Driver/msvc-link.c
+++ b/clang/test/Driver/msvc-link.c
@@ -38,16 +38,16 @@
 // VFSOVERLAY: "/vfsoverlay:{{.*}}" "{{.*}}.obj"
 
 // RUN: %clang -target arm64ec-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64EC %s
-// RUN: %clang_cl -target arm64ec-pc-windows-msvc -fuse-ld=link -### %s 2>&1 | 
FileCheck --check-prefix=ARM64EC %s
-// RUN: %clang_cl -arm64EC -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64EC %s
+// RUN: %clang_cl -target arm64ec-pc-windows-msvc -fuse-ld=link -### -- %s 
2>&1 | FileCheck --check-prefix=ARM64EC %s
+// RUN: %clang_cl -arm64EC -fuse-ld=link -### -- %s 2>&1 | FileCheck 
--check-prefix=ARM64EC %s
 // ARM64EC: "-machine:arm64ec"
 
 // RUN: %clang -target arm64ec-pc-windows-msvc -fuse-ld=link -marm64x -### %s 
2>&1 | \
 // RUN:FileCheck --check-prefix=ARM64X %s
 // RUN: %clang -target aarch64-pc-windows-msvc -fuse-ld=link -marm64x -### %s 
2>&1 | \
 // RUN:FileCheck --check-prefix=ARM64X %s
-// RUN: %clang_cl -marm64x -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
-// RUN: %clang_cl -arm64EC -marm64x -fuse-ld=link -### %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
+// RUN: %clang_cl -marm64x -fuse-ld=link -### -- %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
+// RUN: %clang_cl -arm64EC -marm64x -fuse-ld=link -### -- %s 2>&1 | FileCheck 
--check-prefix=ARM64X %s
 // ARM64X: "-machine:arm64x"
 
 // RUN: not %clang -target x86_64-linux-gnu -marm64x -### %s 2>&1 | FileCheck 
--check-prefix=HYBRID-ERR %s

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][NFC] Fix ARM64EC clang-cl linker driver tests. (PR #87160)

2024-03-30 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed https://github.com/llvm/llvm-project/pull/87160
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-24 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/82888

As suggested by @gbreynoo in #82642.

>From 3f23b5ed11ef7453c64da562ad47701cc77ee3e0 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 24 Feb 2024 01:16:45 +0100
Subject: [PATCH] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host
 triple for the fallback archive format.

---
 .../ClangOffloadPackager.cpp |  2 +-
 llvm/include/llvm/Object/Archive.h   |  2 +-
 llvm/lib/Object/Archive.cpp  |  4 ++--
 llvm/lib/Object/ArchiveWriter.cpp|  2 +-
 llvm/tools/llvm-ar/llvm-ar.cpp   | 16 +++-
 5 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp 
b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
index c36a5aa58cee50..c6d5b31ab512cb 100644
--- a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
+++ b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
@@ -197,7 +197,7 @@ static Error unbundleImages() {
 
   if (Error E = writeArchive(
   Args["file"], Members, SymtabWritingMode::NormalSymtab,
-  Archive::getDefaultKindForHost(), true, false, nullptr))
+  Archive::getDefaultKind(), true, false, nullptr))
 return E;
 } else if (Args.count("file")) {
   if (Extracted.size() > 1)
diff --git a/llvm/include/llvm/Object/Archive.h 
b/llvm/include/llvm/Object/Archive.h
index 66f07939b11050..a3165c3235e0ed 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -338,7 +338,7 @@ class Archive : public Binary {
 
   Kind kind() const { return (Kind)Format; }
   bool isThin() const { return IsThin; }
-  static object::Archive::Kind getDefaultKindForHost();
+  static object::Archive::Kind getDefaultKind();
   static object::Archive::Kind getDefaultKindForTriple(Triple &T);
 
   child_iterator child_begin(Error &Err, bool SkipInternal = true) const;
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index d3fdcd9ee88111..6139d9996bdad3 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -979,8 +979,8 @@ object::Archive::Kind 
Archive::getDefaultKindForTriple(Triple &T) {
   return object::Archive::K_GNU;
 }
 
-object::Archive::Kind Archive::getDefaultKindForHost() {
-  Triple HostTriple(sys::getProcessTriple());
+object::Archive::Kind Archive::getDefaultKind() {
+  Triple HostTriple(sys::getDefaultTargetTriple());
   return getDefaultKindForTriple(HostTriple);
 }
 
diff --git a/llvm/lib/Object/ArchiveWriter.cpp 
b/llvm/lib/Object/ArchiveWriter.cpp
index 02f72521c8b544..978eff64e5ee7d 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -91,7 +91,7 @@ object::Archive::Kind 
NewArchiveMember::detectKindFromObject() const {
 }
   }
 
-  return object::Archive::getDefaultKindForHost();
+  return object::Archive::getDefaultKind();
 }
 
 Expected
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index c58a85c695dacf..0c4392baacd052 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -671,7 +671,7 @@ Expected> getAsBinary(const 
Archive::Child &C,
 }
 
 template  static bool isValidInBitMode(const A &Member) {
-  if (object::Archive::getDefaultKindForHost() != object::Archive::K_AIXBIG)
+  if (object::Archive::getDefaultKind() != object::Archive::K_AIXBIG)
 return true;
   LLVMContext Context;
   Expected> BinOrErr = getAsBinary(Member, &Context);
@@ -1037,10 +1037,10 @@ static void performWriteOperation(ArchiveOperation 
Operation,
   }
 } else if (NewMembersP)
   Kind = !NewMembersP->empty() ? 
NewMembersP->front().detectKindFromObject()
-   : object::Archive::getDefaultKindForHost();
+   : object::Archive::getDefaultKind();
 else
   Kind = !NewMembers.empty() ? NewMembers.front().detectKindFromObject()
- : object::Archive::getDefaultKindForHost();
+ : object::Archive::getDefaultKind();
 break;
   case GNU:
 Kind = object::Archive::K_GNU;
@@ -1335,7 +1335,7 @@ static int ar_main(int argc, char **argv) {
 
   // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
   // specified.
-  if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) {
+  if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
 BitMode = getBitMode(getenv("OBJECT_MODE"));
 if (BitMode == BitModeTy::Unknown)
   BitMode = BitModeTy::Bit32;
@@ -1397,8 +1397,7 @@ static int ar_main(int argc, char **argv) {
   continue;
 
 if (strncmp(*ArgIt, "-X", 2) == 0) {
-  if (object::Archive::getDefaultKindForHost() ==
-  object::Archive::K_AIXBIG) {
+  if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG

[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-26 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/82888

>From 3f23b5ed11ef7453c64da562ad47701cc77ee3e0 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 24 Feb 2024 01:16:45 +0100
Subject: [PATCH 1/2] [llvm-ar][Archive] Use getDefaultTargetTriple instead of
 host triple for the fallback archive format.

---
 .../ClangOffloadPackager.cpp |  2 +-
 llvm/include/llvm/Object/Archive.h   |  2 +-
 llvm/lib/Object/Archive.cpp  |  4 ++--
 llvm/lib/Object/ArchiveWriter.cpp|  2 +-
 llvm/tools/llvm-ar/llvm-ar.cpp   | 16 +++-
 5 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp 
b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
index c36a5aa58cee50..c6d5b31ab512cb 100644
--- a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
+++ b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
@@ -197,7 +197,7 @@ static Error unbundleImages() {
 
   if (Error E = writeArchive(
   Args["file"], Members, SymtabWritingMode::NormalSymtab,
-  Archive::getDefaultKindForHost(), true, false, nullptr))
+  Archive::getDefaultKind(), true, false, nullptr))
 return E;
 } else if (Args.count("file")) {
   if (Extracted.size() > 1)
diff --git a/llvm/include/llvm/Object/Archive.h 
b/llvm/include/llvm/Object/Archive.h
index 66f07939b11050..a3165c3235e0ed 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -338,7 +338,7 @@ class Archive : public Binary {
 
   Kind kind() const { return (Kind)Format; }
   bool isThin() const { return IsThin; }
-  static object::Archive::Kind getDefaultKindForHost();
+  static object::Archive::Kind getDefaultKind();
   static object::Archive::Kind getDefaultKindForTriple(Triple &T);
 
   child_iterator child_begin(Error &Err, bool SkipInternal = true) const;
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index d3fdcd9ee88111..6139d9996bdad3 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -979,8 +979,8 @@ object::Archive::Kind 
Archive::getDefaultKindForTriple(Triple &T) {
   return object::Archive::K_GNU;
 }
 
-object::Archive::Kind Archive::getDefaultKindForHost() {
-  Triple HostTriple(sys::getProcessTriple());
+object::Archive::Kind Archive::getDefaultKind() {
+  Triple HostTriple(sys::getDefaultTargetTriple());
   return getDefaultKindForTriple(HostTriple);
 }
 
diff --git a/llvm/lib/Object/ArchiveWriter.cpp 
b/llvm/lib/Object/ArchiveWriter.cpp
index 02f72521c8b544..978eff64e5ee7d 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -91,7 +91,7 @@ object::Archive::Kind 
NewArchiveMember::detectKindFromObject() const {
 }
   }
 
-  return object::Archive::getDefaultKindForHost();
+  return object::Archive::getDefaultKind();
 }
 
 Expected
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index c58a85c695dacf..0c4392baacd052 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -671,7 +671,7 @@ Expected> getAsBinary(const 
Archive::Child &C,
 }
 
 template  static bool isValidInBitMode(const A &Member) {
-  if (object::Archive::getDefaultKindForHost() != object::Archive::K_AIXBIG)
+  if (object::Archive::getDefaultKind() != object::Archive::K_AIXBIG)
 return true;
   LLVMContext Context;
   Expected> BinOrErr = getAsBinary(Member, &Context);
@@ -1037,10 +1037,10 @@ static void performWriteOperation(ArchiveOperation 
Operation,
   }
 } else if (NewMembersP)
   Kind = !NewMembersP->empty() ? 
NewMembersP->front().detectKindFromObject()
-   : object::Archive::getDefaultKindForHost();
+   : object::Archive::getDefaultKind();
 else
   Kind = !NewMembers.empty() ? NewMembers.front().detectKindFromObject()
- : object::Archive::getDefaultKindForHost();
+ : object::Archive::getDefaultKind();
 break;
   case GNU:
 Kind = object::Archive::K_GNU;
@@ -1335,7 +1335,7 @@ static int ar_main(int argc, char **argv) {
 
   // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
   // specified.
-  if (object::Archive::getDefaultKindForHost() == object::Archive::K_AIXBIG) {
+  if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
 BitMode = getBitMode(getenv("OBJECT_MODE"));
 if (BitMode == BitModeTy::Unknown)
   BitMode = BitModeTy::Bit32;
@@ -1397,8 +1397,7 @@ static int ar_main(int argc, char **argv) {
   continue;
 
 if (strncmp(*ArgIt, "-X", 2) == 0) {
-  if (object::Archive::getDefaultKindForHost() ==
-  object::Archive::K_AIXBIG) {
+  if (object::Archive::getDefaultKind() == object::Archive::K_AIXBIG) {
 Match = *(*ArgIt + 2)

[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-26 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/82888

>From 8ea9b943089de8a6c3f3a5161a4e89eab4975c2a Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 24 Feb 2024 01:16:45 +0100
Subject: [PATCH] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host
 triple for the fallback archive format.

---
 .../ClangOffloadPackager.cpp |  2 +-
 llvm/docs/CommandGuide/llvm-ar.rst   |  5 +++--
 llvm/docs/ReleaseNotes.rst   |  4 
 llvm/include/llvm/Object/Archive.h   |  2 +-
 llvm/lib/Object/Archive.cpp  |  4 ++--
 llvm/lib/Object/ArchiveWriter.cpp|  2 +-
 llvm/tools/llvm-ar/llvm-ar.cpp   | 16 +++-
 7 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp 
b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
index c36a5aa58cee50..c6d5b31ab512cb 100644
--- a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
+++ b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
@@ -197,7 +197,7 @@ static Error unbundleImages() {
 
   if (Error E = writeArchive(
   Args["file"], Members, SymtabWritingMode::NormalSymtab,
-  Archive::getDefaultKindForHost(), true, false, nullptr))
+  Archive::getDefaultKind(), true, false, nullptr))
 return E;
 } else if (Args.count("file")) {
   if (Extracted.size() > 1)
diff --git a/llvm/docs/CommandGuide/llvm-ar.rst 
b/llvm/docs/CommandGuide/llvm-ar.rst
index f643b214bcc837..03d5b9e41ada38 100644
--- a/llvm/docs/CommandGuide/llvm-ar.rst
+++ b/llvm/docs/CommandGuide/llvm-ar.rst
@@ -262,8 +262,9 @@ Other
 .. option:: --format=
 
  This option allows for default, gnu, darwin or bsd  to be selected.
- When creating an ``archive``,  will default to that of the host
- machine.
+ When creating an ``archive`` with the default , :program:``llvm-ar``
+ will attempt to infer it from the input files and fallback to the default
+ toolchain target if unable to do so.
 
 .. option:: -h, --help
 
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 5be00d9d5a5899..8a3a0ec66ed874 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -143,6 +143,10 @@ Changes to the LLVM tools
   files using reference types and GC are also supported (but also only for
   functions, globals, and data, and only for listing symbols and names).
 
+* llvm-ar now utilizes LLVM_DEFAULT_TARGET_TRIPLE to determine the archive 
format
+  if it's not specified with the ``--format`` argument and cannot be inferred 
from
+  input files.
+
 Changes to LLDB
 -
 
diff --git a/llvm/include/llvm/Object/Archive.h 
b/llvm/include/llvm/Object/Archive.h
index 3dd99a46507a24..f71630054dc637 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -338,7 +338,7 @@ class Archive : public Binary {
 
   Kind kind() const { return (Kind)Format; }
   bool isThin() const { return IsThin; }
-  static object::Archive::Kind getDefaultKindForHost();
+  static object::Archive::Kind getDefaultKind();
 
   child_iterator child_begin(Error &Err, bool SkipInternal = true) const;
   child_iterator child_end() const;
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index e447e5b23316f1..9000e9aa81ff41 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -969,8 +969,8 @@ Archive::Archive(MemoryBufferRef Source, Error &Err)
   Err = Error::success();
 }
 
-object::Archive::Kind Archive::getDefaultKindForHost() {
-  Triple HostTriple(sys::getProcessTriple());
+object::Archive::Kind Archive::getDefaultKind() {
+  Triple HostTriple(sys::getDefaultTargetTriple());
   return HostTriple.isOSDarwin()
  ? object::Archive::K_DARWIN
  : (HostTriple.isOSAIX() ? object::Archive::K_AIXBIG
diff --git a/llvm/lib/Object/ArchiveWriter.cpp 
b/llvm/lib/Object/ArchiveWriter.cpp
index 155926a8c5949d..96e4ec1ee0b777 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -90,7 +90,7 @@ object::Archive::Kind 
NewArchiveMember::detectKindFromObject() const {
 }
   }
 
-  return object::Archive::getDefaultKindForHost();
+  return object::Archive::getDefaultKind();
 }
 
 Expected
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index c8800303bc1e42..81cb2a21daf1f2 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -670,7 +670,7 @@ Expected> getAsBinary(const 
Archive::Child &C,
 }
 
 template  static bool isValidInBitMode(const A &Member) {
-  if (object::Archive::getDefaultKindForHost() != object::Archive::K_AIXBIG)
+  if (object::Archive::getDefaultKind() != object::Archive::K_AIXBIG)
 return true;
   LLVMContext Context;
   Expected> BinOrErr = getAsBinary(Member, &Context);
@@ -1036,10 +10

[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-26 Thread Jacek Caban via cfe-commits

cjacek wrote:

I added documentation and rebased, thanks.

https://github.com/llvm/llvm-project/pull/82888
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-27 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/82888

>From 24c0fae7f777daa235ba435e1ae3479d26da526b Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 24 Feb 2024 01:16:45 +0100
Subject: [PATCH] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host
 triple for the fallback archive format.

---
 .../ClangOffloadPackager.cpp |  2 +-
 llvm/docs/CommandGuide/llvm-ar.rst   |  5 +++--
 llvm/docs/ReleaseNotes.rst   |  4 
 llvm/include/llvm/Object/Archive.h   |  2 +-
 llvm/lib/Object/Archive.cpp  |  4 ++--
 llvm/lib/Object/ArchiveWriter.cpp|  2 +-
 llvm/tools/llvm-ar/llvm-ar.cpp   | 16 +++-
 7 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp 
b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
index c36a5aa58cee50..c6d5b31ab512cb 100644
--- a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
+++ b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
@@ -197,7 +197,7 @@ static Error unbundleImages() {
 
   if (Error E = writeArchive(
   Args["file"], Members, SymtabWritingMode::NormalSymtab,
-  Archive::getDefaultKindForHost(), true, false, nullptr))
+  Archive::getDefaultKind(), true, false, nullptr))
 return E;
 } else if (Args.count("file")) {
   if (Extracted.size() > 1)
diff --git a/llvm/docs/CommandGuide/llvm-ar.rst 
b/llvm/docs/CommandGuide/llvm-ar.rst
index f643b214bcc837..03d5b9e41ada38 100644
--- a/llvm/docs/CommandGuide/llvm-ar.rst
+++ b/llvm/docs/CommandGuide/llvm-ar.rst
@@ -262,8 +262,9 @@ Other
 .. option:: --format=
 
  This option allows for default, gnu, darwin or bsd  to be selected.
- When creating an ``archive``,  will default to that of the host
- machine.
+ When creating an ``archive`` with the default , :program:``llvm-ar``
+ will attempt to infer it from the input files and fallback to the default
+ toolchain target if unable to do so.
 
 .. option:: -h, --help
 
diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index 5be00d9d5a5899..8a3a0ec66ed874 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -143,6 +143,10 @@ Changes to the LLVM tools
   files using reference types and GC are also supported (but also only for
   functions, globals, and data, and only for listing symbols and names).
 
+* llvm-ar now utilizes LLVM_DEFAULT_TARGET_TRIPLE to determine the archive 
format
+  if it's not specified with the ``--format`` argument and cannot be inferred 
from
+  input files.
+
 Changes to LLDB
 -
 
diff --git a/llvm/include/llvm/Object/Archive.h 
b/llvm/include/llvm/Object/Archive.h
index 3dd99a46507a24..f71630054dc637 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -338,7 +338,7 @@ class Archive : public Binary {
 
   Kind kind() const { return (Kind)Format; }
   bool isThin() const { return IsThin; }
-  static object::Archive::Kind getDefaultKindForHost();
+  static object::Archive::Kind getDefaultKind();
 
   child_iterator child_begin(Error &Err, bool SkipInternal = true) const;
   child_iterator child_end() const;
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index e447e5b23316f1..9000e9aa81ff41 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -969,8 +969,8 @@ Archive::Archive(MemoryBufferRef Source, Error &Err)
   Err = Error::success();
 }
 
-object::Archive::Kind Archive::getDefaultKindForHost() {
-  Triple HostTriple(sys::getProcessTriple());
+object::Archive::Kind Archive::getDefaultKind() {
+  Triple HostTriple(sys::getDefaultTargetTriple());
   return HostTriple.isOSDarwin()
  ? object::Archive::K_DARWIN
  : (HostTriple.isOSAIX() ? object::Archive::K_AIXBIG
diff --git a/llvm/lib/Object/ArchiveWriter.cpp 
b/llvm/lib/Object/ArchiveWriter.cpp
index 155926a8c5949d..96e4ec1ee0b777 100644
--- a/llvm/lib/Object/ArchiveWriter.cpp
+++ b/llvm/lib/Object/ArchiveWriter.cpp
@@ -90,7 +90,7 @@ object::Archive::Kind 
NewArchiveMember::detectKindFromObject() const {
 }
   }
 
-  return object::Archive::getDefaultKindForHost();
+  return object::Archive::getDefaultKind();
 }
 
 Expected
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index c8800303bc1e42..81cb2a21daf1f2 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -670,7 +670,7 @@ Expected> getAsBinary(const 
Archive::Child &C,
 }
 
 template  static bool isValidInBitMode(const A &Member) {
-  if (object::Archive::getDefaultKindForHost() != object::Archive::K_AIXBIG)
+  if (object::Archive::getDefaultKind() != object::Archive::K_AIXBIG)
 return true;
   LLVMContext Context;
   Expected> BinOrErr = getAsBinary(Member, &Context);
@@ -1036,10 +10

[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-27 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed https://github.com/llvm/llvm-project/pull/82888
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [llvm-ar][Archive] Use getDefaultTargetTriple instead of host triple for the fallback archive format. (PR #82888)

2024-02-27 Thread Jacek Caban via cfe-commits

cjacek wrote:

Thanks. I pushed without tests.

https://github.com/llvm/llvm-project/pull/82888
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[llvm] [clang] Arm64EC entry/exit thunks, consolidated. (PR #79067)

2024-01-24 Thread Jacek Caban via cfe-commits

cjacek wrote:

Thanks!

FWIW, I tested and reviewed the new version and it works and looks good to me.

https://github.com/llvm/llvm-project/pull/79067
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [Clang][AArch64] Define x86_64 macros for ARM64EC targets (PR #65420)

2023-09-10 Thread Jacek Caban via cfe-commits

cjacek wrote:

LGTM

https://github.com/llvm/llvm-project/pull/65420
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] Disable C++14 sized deallocation by default for MinGW targets (PR #97232)

2024-07-01 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.


https://github.com/llvm/llvm-project/pull/97232
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ARM64EC] Add support for parsing __vectorcall (PR #87725)

2024-04-08 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.


https://github.com/llvm/llvm-project/pull/87725
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ARM64EC] Fix compilation of intrin.h in ARM64EC mode. (PR #87717)

2024-04-08 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.

>  (If we actually need some of these intrinsics in ARM64EC mode, we can 
> revisit later.)

FWIW, most of them are provided by MSVC/Windows SDK via `softintrin.h` 
(included from `intrin.h`) as functions, not actual intrisics.

https://github.com/llvm/llvm-project/pull/87717
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ARM64EC] Fix arm_neon.h on ARM64EC. (PR #88572)

2024-04-15 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.


https://github.com/llvm/llvm-project/pull/88572
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [ARM64EC] Add softintrin.lib as an implicit dependency to object files. (PR #89171)

2024-04-18 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.

LGTM (and CI failure doesn't seem related)

https://github.com/llvm/llvm-project/pull/89171
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-27 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-27 Thread Jacek Caban via cfe-commits

cjacek wrote:

/cherry-pick ea98dc8b8f508b8393651992830e5e51d3876728

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-27 Thread Jacek Caban via cfe-commits

cjacek wrote:

Thanks. I created #100872 for dllexport fix.

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-27 Thread Jacek Caban via cfe-commits

https://github.com/cjacek milestoned 
https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-27 Thread Jacek Caban via cfe-commits

cjacek wrote:

/cherry-pick ea98dc8b8f508b8393651992830e5e51d3876728

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-18 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/99478

This adds support for `hybrid_patchable` on top of LLVM part from #92965 (so it 
depends on #92965 and this PR is meant only for the second commit). For the 
most part, it just adds LLVM attribute whenever C/C++ attribute is specified.

I added a warning when it's used on static function. Due to the way it works 
(emitting a reference to an undefined symbol that linker substitutes with a 
generated thunk), it can't work on static functions. MSVC just silently ignores 
it; using it like that seems like a non-obvious mistake to me, so I followed 
MSVC by allowing it too, but emitting an additional warning.

The patch does nothing special for function inlining, which matches my 
experimentation with MSVC. `hybrid_patchable` functions may be specified on 
inline functions. Depending on optimizations taken, when they are actually 
inlined, it has no effect, but when they are not inlined, it works as expected.

>From b27a1205f893204aca939042f7c17dc7b9196cd4 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Fri, 3 May 2024 00:24:39 +0200
Subject: [PATCH 1/2] [CodeGen][ARM64EC] Add support for hybrid_patchable
 attribute.

---
 llvm/include/llvm/Bitcode/LLVMBitCodes.h  |   1 +
 llvm/include/llvm/CodeGen/AsmPrinter.h|   2 +-
 llvm/include/llvm/IR/Attributes.td|   3 +
 llvm/lib/Bitcode/Writer/BitcodeWriter.cpp |   2 +
 llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp|   4 +-
 .../AArch64/AArch64Arm64ECCallLowering.cpp| 138 +++-
 llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp |  27 ++
 .../AArch64/AArch64CallingConvention.td   |   2 +-
 llvm/lib/Transforms/Utils/CodeExtractor.cpp   |   1 +
 .../AArch64/arm64ec-hybrid-patchable.ll   | 315 ++
 10 files changed, 484 insertions(+), 11 deletions(-)
 create mode 100644 llvm/test/CodeGen/AArch64/arm64ec-hybrid-patchable.ll

diff --git a/llvm/include/llvm/Bitcode/LLVMBitCodes.h 
b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
index 184bbe32df695..fb88f2fe75adb 100644
--- a/llvm/include/llvm/Bitcode/LLVMBitCodes.h
+++ b/llvm/include/llvm/Bitcode/LLVMBitCodes.h
@@ -757,6 +757,7 @@ enum AttributeKindCodes {
   ATTR_KIND_RANGE = 92,
   ATTR_KIND_SANITIZE_NUMERICAL_STABILITY = 93,
   ATTR_KIND_INITIALIZES = 94,
+  ATTR_KIND_HYBRID_PATCHABLE = 95,
 };
 
 enum ComdatSelectionKindCodes {
diff --git a/llvm/include/llvm/CodeGen/AsmPrinter.h 
b/llvm/include/llvm/CodeGen/AsmPrinter.h
index dc00bd57d655d..1c4e9e9111441 100644
--- a/llvm/include/llvm/CodeGen/AsmPrinter.h
+++ b/llvm/include/llvm/CodeGen/AsmPrinter.h
@@ -892,7 +892,6 @@ class AsmPrinter : public MachineFunctionPass {
   virtual void emitModuleCommandLines(Module &M);
 
   GCMetadataPrinter *getOrCreateGCPrinter(GCStrategy &S);
-  virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
   void emitGlobalIFunc(Module &M, const GlobalIFunc &GI);
 
 private:
@@ -900,6 +899,7 @@ class AsmPrinter : public MachineFunctionPass {
   bool shouldEmitLabelForBasicBlock(const MachineBasicBlock &MBB) const;
 
 protected:
+  virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA);
   virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const {
 return false;
   }
diff --git a/llvm/include/llvm/IR/Attributes.td 
b/llvm/include/llvm/IR/Attributes.td
index 0457f0c388d26..e1bd193891c1e 100644
--- a/llvm/include/llvm/IR/Attributes.td
+++ b/llvm/include/llvm/IR/Attributes.td
@@ -112,6 +112,9 @@ def ElementType : TypeAttr<"elementtype", [ParamAttr]>;
 /// symbol.
 def FnRetThunkExtern : EnumAttr<"fn_ret_thunk_extern", [FnAttr]>;
 
+/// Function has a hybrid patchable thunk.
+def HybridPatchable : EnumAttr<"hybrid_patchable", [FnAttr]>;
+
 /// Pass structure in an alloca.
 def InAlloca : TypeAttr<"inalloca", [ParamAttr]>;
 
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp 
b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
index b3ebe70e8c52f..324dcbca8137e 100644
--- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -727,6 +727,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind 
Kind) {
 return bitc::ATTR_KIND_HOT;
   case Attribute::ElementType:
 return bitc::ATTR_KIND_ELEMENTTYPE;
+  case Attribute::HybridPatchable:
+return bitc::ATTR_KIND_HYBRID_PATCHABLE;
   case Attribute::InlineHint:
 return bitc::ATTR_KIND_INLINE_HINT;
   case Attribute::InReg:
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp 
b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 1f59ec545b4f7..b46a6d348413b 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -2859,8 +2859,8 @@ bool AsmPrinter::emitSpecialLLVMGlobal(const 
GlobalVariable *GV) {
 auto *Arr = cast(GV->getInitializer());
 for (auto &U : Arr->operands()) {
   auto *C = cast(U);
-  auto *Src = cast(C->getOperand(0)->stripPointerCasts());
-  auto *Dst = cast(C->getOperand(1)->stripPointe

[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-19 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/99478

>From 31584aa0b95dd88df8518bf334fb3e24086b1bdb Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Fri, 3 May 2024 00:27:20 +0200
Subject: [PATCH] [clang][ARM64EC] Add support for hybrid_patchable attribute.

---
 clang/docs/ReleaseNotes.rst   |  3 ++
 clang/include/clang/Basic/Attr.td |  9 +
 clang/include/clang/Basic/AttrDocs.td | 10 ++
 .../clang/Basic/DiagnosticSemaKinds.td|  3 ++
 clang/lib/CodeGen/CodeGenFunction.cpp |  3 ++
 clang/lib/Sema/SemaDecl.cpp   |  5 +++
 clang/lib/Sema/SemaDeclAttr.cpp   |  3 ++
 clang/test/CodeGen/arm64ec-hybrid-patchable.c | 34 +++
 ...a-attribute-supported-attributes-list.test |  1 +
 9 files changed, 71 insertions(+)
 create mode 100644 clang/test/CodeGen/arm64ec-hybrid-patchable.c

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 4efdb076ba768..1c5153f2ecdf6 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -614,6 +614,9 @@ Attribute Changes in Clang
   The attributes declare constraints about a function's behavior pertaining to 
blocking and
   heap memory allocation.
 
+- The ``hybrid_patchable`` attribute is now supported on ARM64EC targets. It 
can be used to specify
+  that a function requires an additional x86-64 thunk, which may be patched at 
runtime.
+
 Improvements to Clang's diagnostics
 ---
 - Clang now emits an error instead of a warning for ``-Wundefined-internal``
diff --git a/clang/include/clang/Basic/Attr.td 
b/clang/include/clang/Basic/Attr.td
index 1293d0ddbc117..7bfda7182a778 100644
--- a/clang/include/clang/Basic/Attr.td
+++ b/clang/include/clang/Basic/Attr.td
@@ -477,6 +477,9 @@ def TargetELF : TargetSpec {
 def TargetELFOrMachO : TargetSpec {
   let ObjectFormats = ["ELF", "MachO"];
 }
+def TargetWindowsArm64EC : TargetSpec {
+  let CustomCode = [{ Target.getTriple().isWindowsArm64EC() }];
+}
 
 def TargetSupportsInitPriority : TargetSpec {
   let CustomCode = [{ !Target.getTriple().isOSzOS() }];
@@ -4027,6 +4030,12 @@ def SelectAny : InheritableAttr {
   let SimpleHandler = 1;
 }
 
+def HybridPatchable : InheritableAttr, 
TargetSpecificAttr {
+  let Spellings = [Declspec<"hybrid_patchable">, Clang<"hybrid_patchable">];
+  let Subjects = SubjectList<[Function]>;
+  let Documentation = [HybridPatchableDocs];
+}
+
 def Thread : Attr {
   let Spellings = [Declspec<"thread">];
   let LangOpts = [MicrosoftExt];
diff --git a/clang/include/clang/Basic/AttrDocs.td 
b/clang/include/clang/Basic/AttrDocs.td
index 09cf4f80bd999..4d0d49edace26 100644
--- a/clang/include/clang/Basic/AttrDocs.td
+++ b/clang/include/clang/Basic/AttrDocs.td
@@ -5984,6 +5984,16 @@ For more information see
 or `msvc documentation `_.
 }]; }
 
+def HybridPatchableDocs : Documentation {
+  let Category = DocCatFunction;
+  let Content = [{
+The ``hybrid_patchable`` attribute declares an ARM64EC function with an 
additional
+x86-64 thunk, which may be patched at runtime.
+
+For more information see
+`ARM64EC ABI documentation 
`_.
+}]; }
+
 def WebAssemblyExportNameDocs : Documentation {
   let Category = DocCatFunction;
   let Content = [{
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index d60f32674ca3a..6cb81e4f36118 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -3671,6 +3671,9 @@ def err_attribute_weak_static : Error<
   "weak declaration cannot have internal linkage">;
 def err_attribute_selectany_non_extern_data : Error<
   "'selectany' can only be applied to data items with external linkage">;
+def warn_attribute_hybrid_patchable_non_extern : Warning<
+  "'hybrid_patchable' is ignored on functions without external linkage">,
+  InGroup;
 def err_declspec_thread_on_thread_variable : Error<
   "'__declspec(thread)' applied to variable that already has a "
   "thread-local storage specifier">;
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp 
b/clang/lib/CodeGen/CodeGenFunction.cpp
index 551db09165dbe..99527cf902d55 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -989,6 +989,9 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType 
RetTy,
   if (D && D->hasAttr())
 Fn->addFnAttr(llvm::Attribute::NoProfile);
 
+  if (D && D->hasAttr())
+Fn->addFnAttr(llvm::Attribute::HybridPatchable);
+
   if (D) {
 // Function attributes take precedence over command line flags.
 if (auto *A = D->getAttr()) {
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index bb25a0b3a45ae..f60cc78be4f92 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -6890,6 +6890,1

[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-19 Thread Jacek Caban via cfe-commits


@@ -4027,6 +4030,12 @@ def SelectAny : InheritableAttr {
   let SimpleHandler = 1;
 }
 
+def HybridPatchable : DeclOrTypeAttr, TargetSpecificAttr {
+  let Spellings = [Declspec<"hybrid_patchable">, GCC<"hybrid_patchable">];

cjacek wrote:

Yes, I was thinking mostly about `__attribute__((hybrid_patchable))` as it's 
the form that mingw will mostly likely want to use, so I meant `GNU`. `Clang` 
sounds good to me if proffered, I changed that and added a test for it.

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-19 Thread Jacek Caban via cfe-commits


@@ -477,6 +477,9 @@ def TargetELF : TargetSpec {
 def TargetELFOrMachO : TargetSpec {
   let ObjectFormats = ["ELF", "MachO"];
 }
+def TargetArm64EC : TargetSpec {

cjacek wrote:

I renamed it to `TargetWindowsArm64EC` in the new version.

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-19 Thread Jacek Caban via cfe-commits


@@ -4027,6 +4030,12 @@ def SelectAny : InheritableAttr {
   let SimpleHandler = 1;
 }
 
+def HybridPatchable : DeclOrTypeAttr, TargetSpecificAttr {

cjacek wrote:

Right, I don't remember why I did it like that. I changed it in the new version.

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][ARM64EC] Add support for hybrid_patchable attribute. (PR #99478)

2024-07-19 Thread Jacek Caban via cfe-commits


@@ -6886,6 +6886,13 @@ static void checkAttributesAfterMerging(Sema &S, 
NamedDecl &ND) {
 }
   }
 
+  if (HybridPatchableAttr *Attr = ND.getAttr()) {
+if (!ND.isExternallyVisible()) {
+  S.Diag(Attr->getLocation(),
+ diag::warn_attribute_hybrid_patchable_non_extern);
+  ND.dropAttr();

cjacek wrote:

Good point, it was a copoy&paste typo. Actually, we don't really need it as 
LLVM part ignores the attribute for static functions itself. I removed that 
line and left only diagnostics part here to slightly simplify the code.

https://github.com/llvm/llvm-project/pull/99478
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang] [NFC] Split checkAttributesAfterMerging() to multiple functions (PR #115464)

2024-11-12 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.


https://github.com/llvm/llvm-project/pull/115464
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lld] [Clang][MinGW] Pass --functionpadmin to the linker when -fms-hotpatch is used (PR #116512)

2024-11-18 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed 
https://github.com/llvm/llvm-project/pull/116512
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lld] [Clang][MinGW] Pass --functionpadmin to the linker when -fms-hotpatch is used (PR #116512)

2024-11-16 Thread Jacek Caban via cfe-commits

cjacek wrote:

GCC offers the `ms_hook_prologue` function attribute as an alternative. It 
provides similar guarantees: it inserts a hardcoded prologue and adds padding. 
However, it applies on a per-function basis, so there isn’t an easy way to make 
the entire module hotpatchable. In GCC, the padding is handled directly by the 
compiler, with no linker involvement, which emits assembly like:
```
.globl  _func
.def_func;  .scl2;  .type   32; .endef
.long0x
.long0x
.long0x
.long0x
_func:
.byte   0x8b, 0xff, 0x55, 0x8b, 0xec
movl$1, %eax
popl%ebp
ret
```

https://github.com/llvm/llvm-project/pull/116512
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lld] [Clang][MinGW] Pass --functionpadmin to the linker when -fms-hotpatch is used (PR #116512)

2024-11-16 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/116512

None

>From c13f631c8074c85242fd1f639fd09aae78fede6a Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 16 Nov 2024 14:16:58 +0100
Subject: [PATCH 1/2] [LLD][MinGW] Add support for --functionpadmin option

This introduces the MinGW counterpart of lld-link's -functionpadmin.
---
 lld/MinGW/Driver.cpp   | 8 
 lld/MinGW/Options.td   | 3 +++
 lld/test/MinGW/driver.test | 7 +++
 3 files changed, 18 insertions(+)

diff --git a/lld/MinGW/Driver.cpp b/lld/MinGW/Driver.cpp
index 553698d4f537fc..706687202b19fb 100644
--- a/lld/MinGW/Driver.cpp
+++ b/lld/MinGW/Driver.cpp
@@ -329,6 +329,14 @@ bool link(ArrayRef argsArr, 
llvm::raw_ostream &stdoutOS,
   add("-build-id");
   }
 
+  if (auto *a = args.getLastArg(OPT_functionpadmin)) {
+StringRef v = a->getValue();
+if (v.empty())
+  add("-functionpadmin");
+else
+  add("-functionpadmin:" + v);
+  }
+
   if (args.hasFlag(OPT_fatal_warnings, OPT_no_fatal_warnings, false))
 add("-WX");
   else
diff --git a/lld/MinGW/Options.td b/lld/MinGW/Options.td
index ff7e21fa808f39..abe5e5c82ca3ff 100644
--- a/lld/MinGW/Options.td
+++ b/lld/MinGW/Options.td
@@ -215,6 +215,9 @@ defm error_limit:
 def build_id: J<"build-id=">, HelpText<"Generate build ID note (pass none to 
disable)">, 
   MetaVarName<"">;
 def : F<"build-id">, Alias, HelpText<"Alias for --build-id=">;
+def functionpadmin: J<"functionpadmin=">, HelpText<"Prepares an image for 
hotpatching">,
+  MetaVarName<"">;
+def : F<"functionpadmin">, Alias, HelpText<"Alias for 
--functionpadmin=">;
 
 // Alias
 def alias_Bdynamic_call_shared: Flag<["-"], "call_shared">, Alias;
diff --git a/lld/test/MinGW/driver.test b/lld/test/MinGW/driver.test
index 2831d155fef128..ed6bc880f8f2d9 100644
--- a/lld/test/MinGW/driver.test
+++ b/lld/test/MinGW/driver.test
@@ -445,6 +445,13 @@ RUN: ld.lld -### foo.o -m i386pep --build-id=fast 2>&1 | 
FileCheck -check-prefix
 BUILD_ID_WARN: unsupported build id hashing: fast, using default hashing.
 BUILD_ID_WARN: -build-id{{ }}
 
+RUN: ld.lld -### foo.o -m i386pep --functionpadmin= 2>&1 | FileCheck 
-check-prefix=FUNCTIONPADMIN %s
+RUN: ld.lld -### foo.o -m i386pep --functionpadmin 2>&1 | FileCheck 
-check-prefix=FUNCTIONPADMIN %s
+FUNCTIONPADMIN: -functionpadmin{{ }}
+
+RUN: ld.lld -### foo.o -m i386pep --functionpadmin=2 2>&1 | FileCheck 
-check-prefix=FUNCTIONPADMIN2 %s
+FUNCTIONPADMIN2: -functionpadmin:2{{ }}
+
 RUN: ld.lld -### foo.o -m i386pep --build-id=none 2>&1 | FileCheck 
-check-prefix=NO_BUILD_ID %s
 RUN: ld.lld -### foo.o -m i386pep -s 2>&1 | FileCheck 
-check-prefix=NO_BUILD_ID %s
 RUN: ld.lld -### foo.o -m i386pep -S 2>&1 | FileCheck 
-check-prefix=NO_BUILD_ID %s

>From 51ebafdc3f6ec6251f042b8a13175f3b017f1833 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 16 Nov 2024 14:32:55 +0100
Subject: [PATCH 2/2] [clang][MinGW] Pass --functionpadmin to the linker when
 -fms-hotpatch is used

---
 clang/lib/Driver/ToolChains/MinGW.cpp | 3 +++
 clang/test/Driver/mingw.cpp   | 4 
 2 files changed, 7 insertions(+)

diff --git a/clang/lib/Driver/ToolChains/MinGW.cpp 
b/clang/lib/Driver/ToolChains/MinGW.cpp
index e51daca5025a80..963de81027ca9f 100644
--- a/clang/lib/Driver/ToolChains/MinGW.cpp
+++ b/clang/lib/Driver/ToolChains/MinGW.cpp
@@ -188,6 +188,9 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, 
const JobAction &JA,
   << A->getSpelling() << GuardArgs;
   }
 
+  if (Args.hasArg(options::OPT_fms_hotpatch))
+CmdArgs.push_back("--functionpadmin");
+
   CmdArgs.push_back("-o");
   const char *OutputFile = Output.getFilename();
   // GCC implicitly adds an .exe extension if it is given an output file name
diff --git a/clang/test/Driver/mingw.cpp b/clang/test/Driver/mingw.cpp
index 4a9ba4d259b46f..9790c86a364f85 100644
--- a/clang/test/Driver/mingw.cpp
+++ b/clang/test/Driver/mingw.cpp
@@ -84,3 +84,7 @@
 // RUN: %clang --target=arm64ec-windows-gnu -### -o /dev/null %s 2>&1 \
 // RUN:   | FileCheck %s --check-prefix CHECK_MINGW_EC_LINK
 // CHECK_MINGW_EC_LINK: "-m" "arm64ecpe"
+
+// RUN: %clang --target=i686-windows-gnu -fms-hotpatch -### -- %s 2>&1 \
+// RUN:| FileCheck %s --check-prefix=FUNCTIONPADMIN
+// FUNCTIONPADMIN: "--functionpadmin"

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [lld] [Clang][MinGW] Pass --functionpadmin to the linker when -fms-hotpatch is used (PR #116512)

2024-11-16 Thread Jacek Caban via cfe-commits

cjacek wrote:

This PR depends on #116511.

It updates `-fms-hotpatch` to behave similarly during linking as it does in 
MSVC mode. However, one limitation remains: object files are marked as 
hotpatchable through CodeView data, so this is only effective when `-gcodeview` 
is enabled. This is similar to the behavior of Clang in MSVC mode when debug 
info is not enabled. MSVC seems to always emit `S_COMPILE3`, even when debug 
info is disabled (in which case, it does not emit any other debug information).


https://github.com/llvm/llvm-project/pull/116512
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Implement parsing of ARM pdata/xdata (PR #137950)

2025-05-04 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/137950
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Set NonVolatileRegisters before calling a personality function (PR #137951)

2025-05-04 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.

Looks reasonable to me overall.

https://github.com/llvm/llvm-project/pull/137951
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Set NonVolatileRegisters before calling a personality function (PR #137951)

2025-05-04 Thread Jacek Caban via cfe-commits


@@ -212,6 +238,21 @@ __libunwind_seh_personality(int version, _Unwind_Action 
state,
   ms_exc.ExceptionInformation[2] = state;
   DISPATCHER_CONTEXT *disp_ctx =
   __unw_seh_get_disp_ctx((unw_cursor_t *)context);
+#if defined(__aarch64__)
+  LOCAL_DISPATCHER_CONTEXT_NONVOLREG_ARM64 nonvol;
+  memcpy(&nonvol.GpNvRegs, &disp_ctx->ContextRecord->X19,
+ sizeof(nonvol.GpNvRegs));
+  for (int i = 0; i < 8; i++)
+nonvol.FpNvRegs[i] = disp_ctx->ContextRecord->V[i + 8].D[0];
+  disp_ctx->NonVolatileRegisters = (PBYTE)&nonvol;

cjacek wrote:

You could avoid the cast by using `nonvol.Buffer` here.

https://github.com/llvm/llvm-project/pull/137951
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Set NonVolatileRegisters before calling a personality function (PR #137951)

2025-05-04 Thread Jacek Caban via cfe-commits

https://github.com/cjacek edited 
https://github.com/llvm/llvm-project/pull/137951
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Implement parsing of aarch64 pdata/xdata (PR #137949)

2025-05-01 Thread Jacek Caban via cfe-commits


@@ -2018,6 +2018,52 @@ bool UnwindCursor::getInfoFromSEH(pint_t pc) {
   _info.handler = 0;
 }
   }
+#elif defined(_LIBUNWIND_TARGET_AARCH64)
+  if (unwindEntry->Flag != 0) { // Packed unwind info
+_info.end_ip = _info.start_ip + unwindEntry->FunctionLength * 4;
+// Only fill in the handler and LSDA if they're stale.
+if (pc != getLastPC()) {
+  // Packed unwind info doesn't have an exception handler.
+  _info.lsda = 0;
+  _info.handler = 0;
+}
+  } else {
+IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY_XDATA *xdata =
+reinterpret_cast(
+base + unwindEntry->UnwindData);
+_info.end_ip = _info.start_ip + xdata->FunctionLength * 4;
+// Only fill in the handler and LSDA if they're stale.
+if (pc != getLastPC()) {
+  if (xdata->ExceptionDataPresent) {
+uint32_t offset = 1; // The main xdata
+uint32_t codeWords = xdata->CodeWords;
+uint32_t epilogScopes = xdata->EpilogCount;
+if (xdata->EpilogCount == 0 && xdata->CodeWords == 0) {
+  uint32_t extensionWord = reinterpret_cast(xdata)[1];
+  codeWords = (extensionWord >> 16) & 0xff;
+  epilogScopes = extensionWord & 0x;
+  offset++;
+}
+if (!xdata->EpilogInHeader)
+  offset += epilogScopes;
+offset += codeWords;
+uint32_t *exceptionHandlerInfo =
+reinterpret_cast(xdata) + offset;
+_dispContext.HandlerData = &exceptionHandlerInfo[1];
+_dispContext.LanguageHandler = reinterpret_cast(
+base + exceptionHandlerInfo[0]);
+_info.lsda = reinterpret_cast(_dispContext.HandlerData);
+if (_dispContext.LanguageHandler)

cjacek wrote:

Should this check `exceptionHandlerInfo[0]` instead, like x64 version does?

https://github.com/llvm/llvm-project/pull/137949
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] Add initial ARM64EC support (PR #138583)

2025-05-05 Thread Jacek Caban via cfe-commits

https://github.com/cjacek created 
https://github.com/llvm/llvm-project/pull/138583

ARM64EC defines `__x86_64__`, which is sufficient to make most C/C++ code 
behave correctly. To preserve an external ABI compatible with x86_64, this 
patch uses the x86_64 context layout and implements `unw_getcontext` by storing 
the appropriate aarch64 registers according to the mapping defined by the 
ARM64EC ABI.



  



Rate limit · GitHub


  body {
background-color: #f6f8fa;
color: #24292e;
font-family: -apple-system,BlinkMacSystemFont,Segoe 
UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;
font-size: 14px;
line-height: 1.5;
margin: 0;
  }

  .container { margin: 50px auto; max-width: 600px; text-align: center; 
padding: 0 24px; }

  a { color: #0366d6; text-decoration: none; }
  a:hover { text-decoration: underline; }

  h1 { line-height: 60px; font-size: 48px; font-weight: 300; margin: 0px; 
text-shadow: 0 1px 0 #fff; }
  p { color: rgba(0, 0, 0, 0.5); margin: 20px 0 40px; }

  ul { list-style: none; margin: 25px 0; padding: 0; }
  li { display: table-cell; font-weight: bold; width: 1%; }

  .logo { display: inline-block; margin-top: 35px; }
  .logo-img-2x { display: none; }
  @media
  only screen and (-webkit-min-device-pixel-ratio: 2),
  only screen and (   min--moz-device-pixel-ratio: 2),
  only screen and ( -o-min-device-pixel-ratio: 2/1),
  only screen and (min-device-pixel-ratio: 2),
  only screen and (min-resolution: 192dpi),
  only screen and (min-resolution: 2dppx) {
.logo-img-1x { display: none; }
.logo-img-2x { display: inline-block; }
  }

  #suggestions {
margin-top: 35px;
color: #ccc;
  }
  #suggestions a {
color: #66;
font-weight: 200;
font-size: 14px;
margin: 0 10px;
  }


  
  



  Whoa there!
  You have exceeded a secondary rate limit.
Please wait a few minutes before you try again;
in some cases this may take up to an hour.
  
  
https://support.github.com/contact";>Contact Support —
https://githubstatus.com";>GitHub Status —
https://twitter.com/githubstatus";>@githubstatus
  

  

  

  

  

  


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] Add initial ARM64EC support (PR #138583)

2025-05-05 Thread Jacek Caban via cfe-commits

cjacek wrote:

This is enough to pass most tests, except for forced unwind. I suspect that 
test requires a similar change to #137949. ARM64EC modules can contain SEH in 
both x86_64 format (for x86_64 code, accessible through PE headers, this should 
already work) and ARM format (for ARM64 code, accessible through CHPE metadata, 
which is not yet implemented). I haven’t looked into that part in detail yet.

`__libunwind_Registers_x86_64_jumpto` can be skipped, as the SEH cursor already 
uses `RtlRestoreContext`. If we were to implement it, it would be more complex 
than on other targets, when jumping to x86 code, we’d need to hand off 
execution to the emulator. The simplest way to handle this would be to 
implement the entire function
in C and delegate to `RtlRestoreContext`.

Due to the additional requirements for symbol mangling and unmangled aliases on 
ARM64EC, the `WEAK_ALIAS` macro isn't suitable in its current form. While it 
could be extended to support this, keeping `WEAK_ALIAS` simple and containing 
the complexity within the ARM64EC-specific code seemed like the cleaner 
approach.


https://github.com/llvm/llvm-project/pull/138583
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Set NonVolatileRegisters before calling a personality function (PR #137951)

2025-05-01 Thread Jacek Caban via cfe-commits


@@ -212,6 +212,11 @@ __libunwind_seh_personality(int version, _Unwind_Action 
state,
   ms_exc.ExceptionInformation[2] = state;
   DISPATCHER_CONTEXT *disp_ctx =
   __unw_seh_get_disp_ctx((unw_cursor_t *)context);
+#if defined(__aarch64__)
+  disp_ctx->NonVolatileRegisters = (PBYTE)&disp_ctx->ContextRecord->X19;

cjacek wrote:

If I understand correctly, `NonVolatileRegisters` should point to 
`DISPATCHER_CONTEXT_NONVOLREG_ARM64`, which also includes FP registers, so the 
layout doesn't match `CONTEXT` struct. I think it should be a separate struct.

https://github.com/llvm/llvm-project/pull/137951
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Implement parsing of ARM pdata/xdata (PR #137950)

2025-05-02 Thread Jacek Caban via cfe-commits
Martin =?utf-8?q?Storsjö?= 
Message-ID:
In-Reply-To: 



@@ -2064,6 +2077,51 @@ bool UnwindCursor::getInfoFromSEH(pint_t pc) {
   }
 }
   }
+#elif defined(_LIBUNWIND_TARGET_ARM)

cjacek wrote:

Given how similar the code is to the aarch64 version, it's a bit unfortunate to 
have to duplicate all of it. Maybe we could condition `UNWIND_INFO_ARM` on the 
target and reuse it for both 64-bit and 32-bit code? I think that would reduce 
the differences to just the `end_ip` calculation.

https://github.com/llvm/llvm-project/pull/137950
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Set NonVolatileRegisters before calling a personality function (PR #137951)

2025-05-02 Thread Jacek Caban via cfe-commits


@@ -212,6 +212,11 @@ __libunwind_seh_personality(int version, _Unwind_Action 
state,
   ms_exc.ExceptionInformation[2] = state;
   DISPATCHER_CONTEXT *disp_ctx =
   __unw_seh_get_disp_ctx((unw_cursor_t *)context);
+#if defined(__aarch64__)
+  disp_ctx->NonVolatileRegisters = (PBYTE)&disp_ctx->ContextRecord->X19;

cjacek wrote:

I'm not very familiar with this, but from what I can tell based on reading the 
Wine source (which itself isn't guaranteed to be entirely correct), that seems 
roughly right. `DISPATCHER_CONTEXT_NONVOLREG_ARM64` is allocated on the stack 
along with `DISPATCHER_CONTEXT` (which libunwind stores in the cursor). It's 
populated from the context at the beginning of unwinding step.

https://github.com/llvm/llvm-project/pull/137951
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] [SEH] Implement parsing of aarch64 pdata/xdata (PR #137949)

2025-05-02 Thread Jacek Caban via cfe-commits

https://github.com/cjacek approved this pull request.

LGTM

https://github.com/llvm/llvm-project/pull/137949
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] Add initial ARM64EC support (PR #138583)

2025-05-07 Thread Jacek Caban via cfe-commits

https://github.com/cjacek updated 
https://github.com/llvm/llvm-project/pull/138583

>From c6c8a12bf33127ba325b526b70eff6fef7e7ee00 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Sat, 3 May 2025 00:24:35 +0200
Subject: [PATCH 1/2] [libunwind] Add initial ARM64EC support

ARM64EC defines __x86_64__, which is sufficient to make most C/C++ code behave 
correctly.
To preserve an external ABI compatible with x86_64, this patch uses the x86_64 
context
layout and implements unw_getcontext by storing the appropriate aarch64 
registers according
to the mapping defined by the ARM64EC ABI.
---
 libunwind/src/UnwindRegistersRestore.S |  2 +-
 libunwind/src/UnwindRegistersSave.S| 49 ++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/libunwind/src/UnwindRegistersRestore.S 
b/libunwind/src/UnwindRegistersRestore.S
index 1702d016c368b..5e199188945df 100644
--- a/libunwind/src/UnwindRegistersRestore.S
+++ b/libunwind/src/UnwindRegistersRestore.S
@@ -66,7 +66,7 @@ DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_x86_jumpto)
   # skip fs
   # skip gs
 
-#elif defined(__x86_64__)
+#elif defined(__x86_64__) && !defined(__arm64ec__)
 
 DEFINE_LIBUNWIND_FUNCTION(__libunwind_Registers_x86_64_jumpto)
 #
diff --git a/libunwind/src/UnwindRegistersSave.S 
b/libunwind/src/UnwindRegistersSave.S
index a489a8ba6df15..12fd81d49299b 100644
--- a/libunwind/src/UnwindRegistersSave.S
+++ b/libunwind/src/UnwindRegistersSave.S
@@ -65,6 +65,53 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
   xorl  %eax, %eax# return UNW_ESUCCESS
   ret
 
+#elif defined(__arm64ec__)
+
+//
+// extern int __unw_getcontext(unw_context_t* thread_state)
+//
+// On entry:
+//  thread_state pointer is in x0
+//
+  .section .text,"xr",discard,"#__unw_getcontext"
+  .p2align 2
+DEFINE_LIBUNWIND_FUNCTION("#__unw_getcontext")
+  stpx8, x27, [x0, #0x000]  // rax, rbx
+  stpx0, x1,  [x0, #0x010]  // rcx, rdx
+  stpx26,x25, [x0, #0x020]  // rdi, rsi
+  movx1, sp
+  stpfp, x1,  [x0, #0x030]  // rbp, rsp
+  stpx2, x3,  [x0, #0x040]  // r8,  r9
+  stpx4, x5,  [x0, #0x050]  // r10, r11
+  stpx19,x20, [x0, #0x060]  // r12, r13
+  stpx21,x22, [x0, #0x070]  // r14, r15
+  strx30, [x0, #0x080]  // store return address as pc
+  stpq0, q1,  [x0, #0x0b0]  // xmm0, xmm1
+  stpq2, q3,  [x0, #0x0d0]  // xmm2, xmm3
+  stpq4, q5,  [x0, #0x0f0]  // xmm4, xmm5
+  stpq6, q7,  [x0, #0x110]  // xmm6, xmm7
+  stpq8, q9,  [x0, #0x130]  // xmm8, xmm9
+  stpq10,q11, [x0, #0x150]  // xmm10,xmm11
+  stpq12,q13, [x0, #0x170]  // xmm12,xmm13
+  stpq14,q15, [x0, #0x190]  // xmm14,xmm15
+  movx0, #0 // return UNW_ESUCCESS
+  ret
+
+  .globl "#unw_getcontext"
+  .set "#unw_getcontext", "#__unw_getcontext"
+  .weak_anti_dep __unw_getcontext
+  .set __unw_getcontext, "#__unw_getcontext"
+  .weak_anti_dep unw_getcontext
+  .set unw_getcontext, "#unw_getcontext"
+
+  .section .hybmp$x,"yi"
+  .symidx "#__unw_getcontext"
+  .symidx $ientry_thunk$cdecl$i8$i8
+  .word 1
+  .text
+
+  EXPORT_SYMBOL(unw_getcontext)
+
 #elif defined(__x86_64__)
 
 #
@@ -1181,7 +1228,9 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
 
 #endif
 
+#ifndef __arm64ec__
   WEAK_ALIAS(__unw_getcontext, unw_getcontext)
+#endif
 
 #endif /* !defined(__USING_SJLJ_EXCEPTIONS__) && !defined(__wasm__) */
 

>From 44ae97a609de583e4b78e0797d6aa3353d480fc9 Mon Sep 17 00:00:00 2001
From: Jacek Caban 
Date: Wed, 7 May 2025 13:34:29 +0200
Subject: [PATCH 2/2] Move alias definition

---
 libunwind/src/UnwindRegistersSave.S | 14 +++---
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/libunwind/src/UnwindRegistersSave.S 
b/libunwind/src/UnwindRegistersSave.S
index 12fd81d49299b..5139a551ad245 100644
--- a/libunwind/src/UnwindRegistersSave.S
+++ b/libunwind/src/UnwindRegistersSave.S
@@ -97,12 +97,8 @@ DEFINE_LIBUNWIND_FUNCTION("#__unw_getcontext")
   movx0, #0 // return UNW_ESUCCESS
   ret
 
-  .globl "#unw_getcontext"
-  .set "#unw_getcontext", "#__unw_getcontext"
   .weak_anti_dep __unw_getcontext
   .set __unw_getcontext, "#__unw_getcontext"
-  .weak_anti_dep unw_getcontext
-  .set unw_getcontext, "#unw_getcontext"
 
   .section .hybmp$x,"yi"
   .symidx "#__unw_getcontext"
@@ -110,8 +106,6 @@ DEFINE_LIBUNWIND_FUNCTION("#__unw_getcontext")
   .word 1
   .text
 
-  EXPORT_SYMBOL(unw_getcontext)
-
 #elif defined(__x86_64__)
 
 #
@@ -1228,7 +1222,13 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
 
 #endif
 
-#ifndef __arm64ec__
+#ifdef __arm64ec__
+  .globl "#unw_getcontext"
+  .set "#unw_getcontext", "#__unw_getcontext"
+  .weak_anti_dep unw_getcontext
+  .set unw_getcontext, "#unw_getcontext"
+  EXPORT_SYMBOL(unw_getcontext)
+#else
   WEAK_ALIAS(__unw_getcontext, unw_getcontext)
 #endif
 

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] Add initial ARM64EC support (PR #138583)

2025-05-07 Thread Jacek Caban via cfe-commits


@@ -1181,7 +1228,9 @@ DEFINE_LIBUNWIND_FUNCTION(__unw_getcontext)
 
 #endif
 
+#ifndef __arm64ec__

cjacek wrote:

That's because the alias is more complex, it needs to account for mangled 
symbol names and requires an additional unmangled weak anti-dependency. 
Ideally, exports would use the demangled form, although the mangled version 
would likely still work. I moved the EC alias definition here to keep things 
cleaner.

https://github.com/llvm/llvm-project/pull/138583
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libunwind] [libunwind] Add initial ARM64EC support (PR #138583)

2025-05-13 Thread Jacek Caban via cfe-commits

https://github.com/cjacek closed 
https://github.com/llvm/llvm-project/pull/138583
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits