[PATCH] D143075: BareMetal ToolChain multilib layering

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added inline comments.



Comment at: clang/lib/Driver/ToolChains/BareMetal.cpp:242-246
+  // No multilibs selected so return a single default multilib.
+  static llvm::SmallVector Default = {Multilib()};
+  return llvm::iterator_range<
+  llvm::SmallVector::const_reverse_iterator>(Default.rbegin(),
+   Default.rend());

What's the reason for returning an empty `Multilib`, could we instead return 
and empty range?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143075/new/

https://reviews.llvm.org/D143075

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


[PATCH] D142986: Enable multilib.yaml in the BareMetal ToolChain

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added inline comments.



Comment at: clang/lib/Driver/ToolChains/BareMetal.cpp:176
+
+#define MULTILIB_YAML_FILENAME "multilib.yaml"
+

This is not idiomatic, I couldn't find any instance of `#define` for string 
literals anywhere in LLVM. I believe the idiomatic LLVM alternative is:
```
static constexpr llvm::StringLiteral MultilibFilename = "multilib.yaml";
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142986/new/

https://reviews.llvm.org/D142986

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


[PATCH] D149946: [LoongArch] Define `ual` feature and override `allowsMisalignedMemoryAccesses`

2023-06-06 Thread Lu Weining via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG47601815ec3a: [LoongArch] Define `ual` feature and override 
`allowsMisalignedMemoryAccesses` (authored by SixWeining).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149946/new/

https://reviews.llvm.org/D149946

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
  clang/test/Driver/loongarch-default-features.c
  clang/test/Driver/loongarch-march.c
  clang/test/Driver/loongarch-mdouble-float.c
  clang/test/Driver/loongarch-mfpu.c
  clang/test/Driver/loongarch-msingle-float.c
  clang/test/Driver/loongarch-msoft-float.c
  clang/test/Driver/loongarch-munaligned-access.c
  clang/test/Driver/munaligned-access-unused.c
  llvm/include/llvm/TargetParser/LoongArchTargetParser.def
  llvm/include/llvm/TargetParser/LoongArchTargetParser.h
  llvm/lib/Target/LoongArch/LoongArch.td
  llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
  llvm/lib/Target/LoongArch/LoongArchISelLowering.h
  llvm/lib/Target/LoongArch/LoongArchSubtarget.h
  llvm/test/CodeGen/LoongArch/calling-conv-common.ll
  llvm/test/CodeGen/LoongArch/ir-instruction/atomicrmw-fp.ll
  llvm/test/CodeGen/LoongArch/tail-calls.ll
  llvm/test/CodeGen/LoongArch/unaligned-access.ll
  llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll

Index: llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll
@@ -0,0 +1,97 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
+
+;; Test how memcpy is optimized when ual is turned off which is similar to AArch64/arm64-misaligned-memcpy-inline.ll.
+
+; RUN: llc --mtriple=loongarch32 --mattr=-ual < %s | FileCheck %s --check-prefix=LA32
+; RUN: llc --mtriple=loongarch64 --mattr=-ual < %s | FileCheck %s --check-prefix=LA64
+
+;; Small (16 bytes here) unaligned memcpy() should be a function call if
+;; ual is turned off.
+define void @t0(ptr %out, ptr %in) {
+; LA32-LABEL: t0:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:addi.w $sp, $sp, -16
+; LA32-NEXT:.cfi_def_cfa_offset 16
+; LA32-NEXT:st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NEXT:.cfi_offset 1, -4
+; LA32-NEXT:ori $a2, $zero, 16
+; LA32-NEXT:bl %plt(memcpy)
+; LA32-NEXT:ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NEXT:addi.w $sp, $sp, 16
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t0:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:addi.d $sp, $sp, -16
+; LA64-NEXT:.cfi_def_cfa_offset 16
+; LA64-NEXT:st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NEXT:.cfi_offset 1, -8
+; LA64-NEXT:ori $a2, $zero, 16
+; LA64-NEXT:bl %plt(memcpy)
+; LA64-NEXT:ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NEXT:addi.d $sp, $sp, 16
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 16, i1 false)
+  ret void
+}
+
+;; Small (16 bytes here) aligned memcpy() should be inlined even if
+;; ual is turned off.
+define void @t1(ptr align 8 %out, ptr align 8 %in) {
+; LA32-LABEL: t1:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:ld.w $a2, $a1, 12
+; LA32-NEXT:st.w $a2, $a0, 12
+; LA32-NEXT:ld.w $a2, $a1, 8
+; LA32-NEXT:st.w $a2, $a0, 8
+; LA32-NEXT:ld.w $a2, $a1, 4
+; LA32-NEXT:st.w $a2, $a0, 4
+; LA32-NEXT:ld.w $a1, $a1, 0
+; LA32-NEXT:st.w $a1, $a0, 0
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t1:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:ld.d $a2, $a1, 8
+; LA64-NEXT:st.d $a2, $a0, 8
+; LA64-NEXT:ld.d $a1, $a1, 0
+; LA64-NEXT:st.d $a1, $a0, 0
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %out, ptr align 8 %in, i64 16, i1 false)
+  ret void
+}
+
+;; Tiny (4 bytes here) unaligned memcpy() should be inlined with byte sized
+;; loads and stores if ual is turned off.
+define void @t2(ptr %out, ptr %in) {
+; LA32-LABEL: t2:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:ld.b $a2, $a1, 3
+; LA32-NEXT:st.b $a2, $a0, 3
+; LA32-NEXT:ld.b $a2, $a1, 2
+; LA32-NEXT:st.b $a2, $a0, 2
+; LA32-NEXT:ld.b $a2, $a1, 1
+; LA32-NEXT:st.b $a2, $a0, 1
+; LA32-NEXT:ld.b $a1, $a1, 0
+; LA32-NEXT:st.b $a1, $a0, 0
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t2:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:ld.b $a2, $a1, 3
+; LA64-NEXT:st.b $a2, $a0, 3
+; LA64-NEXT:ld.b $a2, $a1, 2
+; LA64-NEXT:st.b $a2, $a0, 2
+; LA64-NEXT:ld.b $a2, $a1, 1
+; LA64-NEXT:st.b $a2, $a0, 1
+; LA64-NEXT:ld.b $a1, $a1, 0
+; LA64-NEXT:st.b $a1, $a0, 0
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 4, i1 false)
+  ret void
+}
+
+declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1)
Index: 

[clang] 4760181 - [LoongArch] Define `ual` feature and override `allowsMisalignedMemoryAccesses`

2023-06-06 Thread Weining Lu via cfe-commits

Author: Weining Lu
Date: 2023-06-07T13:40:58+08:00
New Revision: 47601815ec3a4f31c797c75748af08acfabc46dc

URL: 
https://github.com/llvm/llvm-project/commit/47601815ec3a4f31c797c75748af08acfabc46dc
DIFF: 
https://github.com/llvm/llvm-project/commit/47601815ec3a4f31c797c75748af08acfabc46dc.diff

LOG: [LoongArch] Define `ual` feature and override 
`allowsMisalignedMemoryAccesses`

Some CPUs do not allow memory accesses to be unaligned, e.g. 2k1000la
who uses the la264 core on which misaligned access will trigger an
exception.

In this patch, a backend feature called `ual` is defined to decribe
whether the CPU supports unaligned memroy accesses. And this feature
can be toggled by clang options `-m[no-]unaligned-access` or the
aliases `-m[no-]strict-align`. When this feature is on,
`allowsMisalignedMemoryAccesses` sets the speed number to 1 and returns
true that allows the codegen to generate unaligned memory access insns.

Clang options `-m[no-]unaligned-access` are moved from `m_arm_Features_Group`
to `m_Group` because now more than one targets use them. And a test
is added to show that they remain unused on a target that does not
support them. In addition, to keep compatible with gcc, a new alias
`-mno-strict-align` is added which is equal to `-munaligned-access`.

The feature name `ual` is consistent with linux kernel [1] and the
output of `lscpu` or `/proc/cpuinfo` [2].

There is an `LLT` variant of `allowsMisalignedMemoryAccesses`, but
seems that curently it is only used in GlobalISel which LoongArch
doesn't support yet. So this variant is not implemented in this patch.

[1]: 
https://github.com/torvalds/linux/blob/master/arch/loongarch/include/asm/cpu.h#L77
[2]: 
https://github.com/torvalds/linux/blob/master/arch/loongarch/kernel/proc.c#L75

Reviewed By: xen0n

Differential Revision: https://reviews.llvm.org/D149946

Added: 
clang/test/Driver/loongarch-munaligned-access.c
clang/test/Driver/munaligned-access-unused.c
llvm/test/CodeGen/LoongArch/unaligned-access.ll
llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll

Modified: 
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
clang/test/Driver/loongarch-default-features.c
clang/test/Driver/loongarch-march.c
clang/test/Driver/loongarch-mdouble-float.c
clang/test/Driver/loongarch-mfpu.c
clang/test/Driver/loongarch-msingle-float.c
clang/test/Driver/loongarch-msoft-float.c
llvm/include/llvm/TargetParser/LoongArchTargetParser.def
llvm/include/llvm/TargetParser/LoongArchTargetParser.h
llvm/lib/Target/LoongArch/LoongArch.td
llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
llvm/lib/Target/LoongArch/LoongArchISelLowering.h
llvm/lib/Target/LoongArch/LoongArchSubtarget.h
llvm/test/CodeGen/LoongArch/calling-conv-common.ll
llvm/test/CodeGen/LoongArch/ir-instruction/atomicrmw-fp.ll
llvm/test/CodeGen/LoongArch/tail-calls.ll

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 879f12fe3a1e3..3326db0791aaf 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3697,12 +3697,14 @@ def mrvv_vector_bits_EQ : Joined<["-"], 
"mrvv-vector-bits=">, Group,
"to use the value implied by -march/-mcpu. Value will be reflected "
"in __riscv_v_fixed_vlen preprocessor define (RISC-V only)">;
 
-def munaligned_access : Flag<["-"], "munaligned-access">, 
Group,
-  HelpText<"Allow memory accesses to be unaligned (AArch32/AArch64 only)">;
-def mno_unaligned_access : Flag<["-"], "mno-unaligned-access">, 
Group,
-  HelpText<"Force all memory accesses to be aligned (AArch32/AArch64 only)">;
+def munaligned_access : Flag<["-"], "munaligned-access">, Group,
+  HelpText<"Allow memory accesses to be unaligned (AArch32/AArch64/LoongArch 
only)">;
+def mno_unaligned_access : Flag<["-"], "mno-unaligned-access">, Group,
+  HelpText<"Force all memory accesses to be aligned (AArch32/AArch64/LoongArch 
only)">;
 def mstrict_align : Flag<["-"], "mstrict-align">, Alias, 
Flags<[CC1Option,HelpHidden]>,
   HelpText<"Force all memory accesses to be aligned (same as 
mno-unaligned-access)">;
+def mno_strict_align : Flag<["-"], "mno-strict-align">, 
Alias, Flags<[CC1Option,HelpHidden]>,
+  HelpText<"Allow memory accesses to be unaligned (same as 
munaligned-access)">;
 def mno_thumb : Flag<["-"], "mno-thumb">, Group;
 def mrestrict_it: Flag<["-"], "mrestrict-it">, Group,
   HelpText<"Disallow generation of complex IT blocks.">;

diff  --git a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp 
b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
index dce003e769577..44c7472f60a60 100644
--- a/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
@@ -7,6 +7,7 @@
 

[PATCH] D142933: Add -print-multi-selection-flags-experimental option

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added inline comments.



Comment at: clang/include/clang/Driver/Options.td:4261
 def print_multi_lib : Flag<["-", "--"], "print-multi-lib">;
+def print_multi_selection_flags : Flag<["-", "--"], 
"print-multi-selection-flags-experimental">,
+  HelpText<"Print the flags used for selecting multilibs (experimental)">;

This is just a suggestion, but I'd consider dropping `selection`, that is the 
name of the flag would be just `-print-multi-flags`. It's not clear to me what 
the "selection" means in this context and I'm not sure if it provides any 
additional value.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142933/new/

https://reviews.llvm.org/D142933

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


[PATCH] D149946: [LoongArch] Define `ual` feature and override `allowsMisalignedMemoryAccesses`

2023-06-06 Thread Lu Weining via Phabricator via cfe-commits
SixWeining updated this revision to Diff 529164.
SixWeining added a comment.

rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149946/new/

https://reviews.llvm.org/D149946

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Arch/LoongArch.cpp
  clang/test/Driver/loongarch-default-features.c
  clang/test/Driver/loongarch-march.c
  clang/test/Driver/loongarch-mdouble-float.c
  clang/test/Driver/loongarch-mfpu.c
  clang/test/Driver/loongarch-msingle-float.c
  clang/test/Driver/loongarch-msoft-float.c
  clang/test/Driver/loongarch-munaligned-access.c
  clang/test/Driver/munaligned-access-unused.c
  llvm/include/llvm/TargetParser/LoongArchTargetParser.def
  llvm/include/llvm/TargetParser/LoongArchTargetParser.h
  llvm/lib/Target/LoongArch/LoongArch.td
  llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
  llvm/lib/Target/LoongArch/LoongArchISelLowering.h
  llvm/lib/Target/LoongArch/LoongArchSubtarget.h
  llvm/test/CodeGen/LoongArch/calling-conv-common.ll
  llvm/test/CodeGen/LoongArch/ir-instruction/atomicrmw-fp.ll
  llvm/test/CodeGen/LoongArch/tail-calls.ll
  llvm/test/CodeGen/LoongArch/unaligned-access.ll
  llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll

Index: llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll
===
--- /dev/null
+++ llvm/test/CodeGen/LoongArch/unaligned-memcpy-inline.ll
@@ -0,0 +1,97 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
+
+;; Test how memcpy is optimized when ual is turned off which is similar to AArch64/arm64-misaligned-memcpy-inline.ll.
+
+; RUN: llc --mtriple=loongarch32 --mattr=-ual < %s | FileCheck %s --check-prefix=LA32
+; RUN: llc --mtriple=loongarch64 --mattr=-ual < %s | FileCheck %s --check-prefix=LA64
+
+;; Small (16 bytes here) unaligned memcpy() should be a function call if
+;; ual is turned off.
+define void @t0(ptr %out, ptr %in) {
+; LA32-LABEL: t0:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:addi.w $sp, $sp, -16
+; LA32-NEXT:.cfi_def_cfa_offset 16
+; LA32-NEXT:st.w $ra, $sp, 12 # 4-byte Folded Spill
+; LA32-NEXT:.cfi_offset 1, -4
+; LA32-NEXT:ori $a2, $zero, 16
+; LA32-NEXT:bl %plt(memcpy)
+; LA32-NEXT:ld.w $ra, $sp, 12 # 4-byte Folded Reload
+; LA32-NEXT:addi.w $sp, $sp, 16
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t0:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:addi.d $sp, $sp, -16
+; LA64-NEXT:.cfi_def_cfa_offset 16
+; LA64-NEXT:st.d $ra, $sp, 8 # 8-byte Folded Spill
+; LA64-NEXT:.cfi_offset 1, -8
+; LA64-NEXT:ori $a2, $zero, 16
+; LA64-NEXT:bl %plt(memcpy)
+; LA64-NEXT:ld.d $ra, $sp, 8 # 8-byte Folded Reload
+; LA64-NEXT:addi.d $sp, $sp, 16
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 16, i1 false)
+  ret void
+}
+
+;; Small (16 bytes here) aligned memcpy() should be inlined even if
+;; ual is turned off.
+define void @t1(ptr align 8 %out, ptr align 8 %in) {
+; LA32-LABEL: t1:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:ld.w $a2, $a1, 12
+; LA32-NEXT:st.w $a2, $a0, 12
+; LA32-NEXT:ld.w $a2, $a1, 8
+; LA32-NEXT:st.w $a2, $a0, 8
+; LA32-NEXT:ld.w $a2, $a1, 4
+; LA32-NEXT:st.w $a2, $a0, 4
+; LA32-NEXT:ld.w $a1, $a1, 0
+; LA32-NEXT:st.w $a1, $a0, 0
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t1:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:ld.d $a2, $a1, 8
+; LA64-NEXT:st.d $a2, $a0, 8
+; LA64-NEXT:ld.d $a1, $a1, 0
+; LA64-NEXT:st.d $a1, $a0, 0
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr align 8 %out, ptr align 8 %in, i64 16, i1 false)
+  ret void
+}
+
+;; Tiny (4 bytes here) unaligned memcpy() should be inlined with byte sized
+;; loads and stores if ual is turned off.
+define void @t2(ptr %out, ptr %in) {
+; LA32-LABEL: t2:
+; LA32:   # %bb.0: # %entry
+; LA32-NEXT:ld.b $a2, $a1, 3
+; LA32-NEXT:st.b $a2, $a0, 3
+; LA32-NEXT:ld.b $a2, $a1, 2
+; LA32-NEXT:st.b $a2, $a0, 2
+; LA32-NEXT:ld.b $a2, $a1, 1
+; LA32-NEXT:st.b $a2, $a0, 1
+; LA32-NEXT:ld.b $a1, $a1, 0
+; LA32-NEXT:st.b $a1, $a0, 0
+; LA32-NEXT:ret
+;
+; LA64-LABEL: t2:
+; LA64:   # %bb.0: # %entry
+; LA64-NEXT:ld.b $a2, $a1, 3
+; LA64-NEXT:st.b $a2, $a0, 3
+; LA64-NEXT:ld.b $a2, $a1, 2
+; LA64-NEXT:st.b $a2, $a0, 2
+; LA64-NEXT:ld.b $a2, $a1, 1
+; LA64-NEXT:st.b $a2, $a0, 1
+; LA64-NEXT:ld.b $a1, $a1, 0
+; LA64-NEXT:st.b $a1, $a0, 0
+; LA64-NEXT:ret
+entry:
+  call void @llvm.memcpy.p0.p0.i64(ptr %out, ptr %in, i64 4, i1 false)
+  ret void
+}
+
+declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1)
Index: llvm/test/CodeGen/LoongArch/unaligned-access.ll
===
--- /dev/null
+++ llvm/test/CodeGen/LoongArch/unaligned-access.ll
@@ -0,0 +1,72 @@
+; NOTE: 

[PATCH] D142933: Add -print-multi-selection-flags-experimental option

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added inline comments.



Comment at: clang/lib/Driver/ToolChain.cpp:250-285
+  // Enumerate boolean flags we care about for the purposes of multilib here.
+  // There must be a smarter way to do it but this gets us started.
+  const struct HasFlag {
+ID Pos, Neg;
+bool Default;
+  } HasFlagList[] = {
+  {OPT_fexceptions, OPT_fno_exceptions, true},

I'd suggest omitting these for the initial version. Ideally we would find a way 
to specify these more generally through Clang's option parser rather than 
individually listing all flags here, but that can be done in a follow up change.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142933/new/

https://reviews.llvm.org/D142933

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


[PATCH] D142932: Multilib YAML parsing

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added a comment.

The only remaining concern I have is about the YAML schema, specifically the 
naming of `Regex`, `MatchFlags` and `NoMatchFlags` fields. Specifically, I 
think it something like this might be cleaner:

  FlagMap:
  - Match: --target=thumbv8(\.[0-9]+)?m\.base-none-unknown-eabi
Flags: [--target=thumbv6m-none-unknown-eabi]

The fact that the value is a regular expression is implied by  the name of the 
field `Match` since the term "matching operation" is commonly used with regular 
expression . For the negative case 
we could use `NoMatch`.

I'm open to other ideas though, this is just a suggestion.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142932/new/

https://reviews.llvm.org/D142932

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


[PATCH] D151437: [NFC][Driver] Change MultilibBuilder interface

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek added inline comments.



Comment at: clang/include/clang/Driver/MultilibBuilder.h:80
+  /// \p Flag must be a flag accepted by the driver.
+  MultilibBuilder (bool Required, StringRef Flag);
 

I think it would be cleaner to swap the order of arguments and give the boolean 
argument a default value. When setting the optional argument, ideally we would 
always use put the argument in the comment which is a standard convention in 
LLVM.

I also think that `Required` is not the best name because it might suggest that 
`Required=false` means that the argument is optional. A better name might be 
something like `Negate` or `Disallow` which would also match the `!` notation.

Here's a concrete example of what I have in mind:

```
  Multilibs.push_back(MultilibBuilder("asan+noexcept", {}, {})
  .flag("-fsanitize=address")
  .flag("-fexceptions", /*Negate=*/false)
  .flag("-fno-exceptions")
  .makeMultilib());
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151437/new/

https://reviews.llvm.org/D151437

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


[PATCH] D112932: Use llvm.is_fpclass to implement FP classification functions

2023-06-06 Thread Serge Pavlov via Phabricator via cfe-commits
sepavloff updated this revision to Diff 529156.
sepavloff added a comment.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

Add createIsFPClass to IRBuilder


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D112932/new/

https://reviews.llvm.org/D112932

Files:
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/test/CodeGen/X86/strictfp_builtins.c
  clang/test/CodeGen/aarch64-strictfp-builtins.c
  clang/test/CodeGen/builtin_float.c
  clang/test/CodeGen/builtin_float_strictfp.c
  clang/test/CodeGen/builtins.c
  clang/test/CodeGen/isfpclass.c
  clang/test/CodeGen/strictfp_builtins.c
  llvm/include/llvm/IR/IRBuilder.h
  llvm/lib/IR/IRBuilder.cpp

Index: llvm/lib/IR/IRBuilder.cpp
===
--- llvm/lib/IR/IRBuilder.cpp
+++ llvm/lib/IR/IRBuilder.cpp
@@ -1375,6 +1375,14 @@
   return Fn;
 }
 
+Value *IRBuilderBase::createIsFPClass(Value *FPNum, unsigned Test) {
+  auto TestV = llvm::ConstantInt::get(Type::getInt32Ty(Context), Test);
+  Module *M = BB->getParent()->getParent();
+  Function *FnIsFPClass =
+  Intrinsic::getDeclaration(M, Intrinsic::is_fpclass, {FPNum->getType()});
+  return CreateCall(FnIsFPClass, {FPNum, TestV});
+}
+
 CallInst *IRBuilderBase::CreateAlignmentAssumptionHelper(const DataLayout ,
  Value *PtrValue,
  Value *AlignValue,
Index: llvm/include/llvm/IR/IRBuilder.h
===
--- llvm/include/llvm/IR/IRBuilder.h
+++ llvm/include/llvm/IR/IRBuilder.h
@@ -2518,6 +2518,8 @@
  unsigned Index, unsigned FieldIndex,
  MDNode *DbgInfo);
 
+  Value *createIsFPClass(Value *FPNum, unsigned Test);
+
 private:
   /// Helper function that creates an assume intrinsic call that
   /// represents an alignment assumption on the provided pointer \p PtrValue
Index: clang/test/CodeGen/strictfp_builtins.c
===
--- clang/test/CodeGen/strictfp_builtins.c
+++ clang/test/CodeGen/strictfp_builtins.c
@@ -17,7 +17,7 @@
 // CHECK-NEXT:store i32 [[X:%.*]], ptr [[X_ADDR]], align 4
 // CHECK-NEXT:[[TMP0:%.*]] = load ptr, ptr [[STR_ADDR]], align 8
 // CHECK-NEXT:[[TMP1:%.*]] = load i32, ptr [[X_ADDR]], align 4
-// CHECK-NEXT:[[CALL:%.*]] = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef [[TMP0]], i32 noundef [[TMP1]]) [[ATTR4:#.*]]
+// CHECK-NEXT:[[CALL:%.*]] = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef [[TMP0]], i32 noundef [[TMP1]]) #[[ATTR4:[0-9]+]]
 // CHECK-NEXT:ret void
 //
 void p(char *str, int x) {
@@ -31,21 +31,21 @@
 // CHECK-NEXT:[[D_ADDR:%.*]] = alloca double, align 8
 // CHECK-NEXT:store double [[D:%.*]], ptr [[D_ADDR]], align 8
 // CHECK-NEXT:[[TMP0:%.*]] = load double, ptr [[D_ADDR]], align 8
-// CHECK-NEXT:[[ISZERO:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP0]], double 0.00e+00, metadata !"oeq", metadata !"fpexcept.strict") [[ATTR4]]
+// CHECK-NEXT:[[ISZERO:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP0]], double 0.00e+00, metadata !"oeq", metadata !"fpexcept.strict") #[[ATTR4]]
 // CHECK-NEXT:br i1 [[ISZERO]], label [[FPCLASSIFY_END:%.*]], label [[FPCLASSIFY_NOT_ZERO:%.*]]
 // CHECK:   fpclassify_end:
 // CHECK-NEXT:[[FPCLASSIFY_RESULT:%.*]] = phi i32 [ 4, [[ENTRY:%.*]] ], [ 0, [[FPCLASSIFY_NOT_ZERO]] ], [ 1, [[FPCLASSIFY_NOT_NAN:%.*]] ], [ [[TMP2:%.*]], [[FPCLASSIFY_NOT_INF:%.*]] ]
-// CHECK-NEXT:call void @p(ptr noundef @.str.1, i32 noundef [[FPCLASSIFY_RESULT]]) [[ATTR4]]
+// CHECK-NEXT:call void @p(ptr noundef @.str.1, i32 noundef [[FPCLASSIFY_RESULT]]) #[[ATTR4]]
 // CHECK-NEXT:ret void
 // CHECK:   fpclassify_not_zero:
-// CHECK-NEXT:[[CMP:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP0]], double [[TMP0]], metadata !"uno", metadata !"fpexcept.strict") [[ATTR4]]
+// CHECK-NEXT:[[CMP:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP0]], double [[TMP0]], metadata !"uno", metadata !"fpexcept.strict") #[[ATTR4]]
 // CHECK-NEXT:br i1 [[CMP]], label [[FPCLASSIFY_END]], label [[FPCLASSIFY_NOT_NAN]]
 // CHECK:   fpclassify_not_nan:
-// CHECK-NEXT:[[TMP1:%.*]] = call double @llvm.fabs.f64(double [[TMP0]]) [[ATTR5:#.*]]
-// CHECK-NEXT:[[ISINF:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP1]], double 0x7FF0, metadata !"oeq", metadata !"fpexcept.strict") [[ATTR4]]
+// CHECK-NEXT:[[TMP1:%.*]] = call double @llvm.fabs.f64(double [[TMP0]]) #[[ATTR5:[0-9]+]]
+// CHECK-NEXT:[[ISINF:%.*]] = call i1 @llvm.experimental.constrained.fcmp.f64(double [[TMP1]], double 0x7FF0, metadata !"oeq", metadata !"fpexcept.strict") 

[PATCH] D151438: [NFC][Driver] Change Multilib flag representation

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rGce8fa36e59e1: [NFC][Driver] Change Multilib flag 
representation (authored by michaelplatings).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151438/new/

https://reviews.llvm.org/D151438

Files:
  clang/include/clang/Driver/Multilib.h
  clang/include/clang/Driver/MultilibBuilder.h
  clang/lib/Driver/Multilib.cpp
  clang/lib/Driver/MultilibBuilder.cpp
  clang/lib/Driver/ToolChains/CommonArgs.cpp
  clang/lib/Driver/ToolChains/OHOS.cpp
  clang/unittests/Driver/MultilibBuilderTest.cpp

Index: clang/unittests/Driver/MultilibBuilderTest.cpp
===
--- clang/unittests/Driver/MultilibBuilderTest.cpp
+++ clang/unittests/Driver/MultilibBuilderTest.cpp
@@ -58,7 +58,7 @@
   MultilibBuilder().flag(true, "-f1").flag(true, "-f2").flag(false, "-f3");
   for (const std::string  : M.flags()) {
 ASSERT_TRUE(llvm::StringSwitch(A)
-.Cases("+f1", "+f2", "-f3", true)
+.Cases("-f1", "-f2", "!f3", true)
 .Default(false));
   }
 }
@@ -71,9 +71,9 @@
   ASSERT_TRUE(MS.size() == 2);
   for (MultilibSet::const_iterator I = MS.begin(), E = MS.end(); I != E; ++I) {
 if (I->gccSuffix() == "/64")
-  ASSERT_TRUE(*I->flags().begin() == "+m64");
-else if (I->gccSuffix() == "")
   ASSERT_TRUE(*I->flags().begin() == "-m64");
+else if (I->gccSuffix() == "")
+  ASSERT_TRUE(*I->flags().begin() == "!m64");
 else
   FAIL() << "Unrecognized gccSufix: " << I->gccSuffix();
   }
@@ -92,19 +92,19 @@
 .Default(false))
 << "Multilib " << *I << " wasn't expected";
 ASSERT_TRUE(llvm::StringSwitch(I->gccSuffix())
-.Case("", is_contained(I->flags(), "-sof"))
-.Case("/sof", is_contained(I->flags(), "+sof"))
-.Case("/el", is_contained(I->flags(), "-sof"))
-.Case("/sof/el", is_contained(I->flags(), "+sof"))
+.Case("", is_contained(I->flags(), "!sof"))
+.Case("/sof", is_contained(I->flags(), "-sof"))
+.Case("/el", is_contained(I->flags(), "!sof"))
+.Case("/sof/el", is_contained(I->flags(), "-sof"))
 .Default(false))
-<< "Multilib " << *I << " didn't have the appropriate {+,-}sof flag";
+<< "Multilib " << *I << " didn't have the appropriate {-,!}sof flag";
 ASSERT_TRUE(llvm::StringSwitch(I->gccSuffix())
-.Case("", is_contained(I->flags(), "-EL"))
-.Case("/sof", is_contained(I->flags(), "-EL"))
-.Case("/el", is_contained(I->flags(), "+EL"))
-.Case("/sof/el", is_contained(I->flags(), "+EL"))
+.Case("", is_contained(I->flags(), "!EL"))
+.Case("/sof", is_contained(I->flags(), "!EL"))
+.Case("/el", is_contained(I->flags(), "-EL"))
+.Case("/sof/el", is_contained(I->flags(), "-EL"))
 .Default(false))
-<< "Multilib " << *I << " didn't have the appropriate {+,-}EL flag";
+<< "Multilib " << *I << " didn't have the appropriate {-,!}EL flag";
   }
 }
 
@@ -160,17 +160,17 @@
 .Maybe(MultilibBuilder("64").flag(true, "-m64"))
 .makeMultilibSet();
 
-  Multilib::flags_list FlagM64 = {"+m64"};
+  Multilib::flags_list FlagM64 = {"-m64"};
   Multilib SelectionM64;
   ASSERT_TRUE(MS1.select(FlagM64, SelectionM64))
-  << "Flag set was {\"+m64\"}, but selection not found";
+  << "Flag set was {\"-m64\"}, but selection not found";
   ASSERT_TRUE(SelectionM64.gccSuffix() == "/64")
   << "Selection picked " << SelectionM64 << " which was not expected";
 
-  Multilib::flags_list FlagNoM64 = {"-m64"};
+  Multilib::flags_list FlagNoM64 = {"!m64"};
   Multilib SelectionNoM64;
   ASSERT_TRUE(MS1.select(FlagNoM64, SelectionNoM64))
-  << "Flag set was {\"-m64\"}, but selection not found";
+  << "Flag set was {\"!m64\"}, but selection not found";
   ASSERT_TRUE(SelectionNoM64.gccSuffix() == "")
   << "Selection picked " << SelectionNoM64 << " which was not expected";
 }
@@ -186,19 +186,19 @@
 bool IsSF = I & 0x2;
 Multilib::flags_list Flags;
 if (IsEL)
-  Flags.push_back("+EL");
-else
   Flags.push_back("-EL");
+else
+  Flags.push_back("!EL");
 
 if (IsSF)
-  Flags.push_back("+SF");
-else
   Flags.push_back("-SF");
+else
+  Flags.push_back("!SF");
 
 Multilib Selection;
 ASSERT_TRUE(MS2.select(Flags, Selection))
-<< "Selection failed for " << (IsEL ? "+EL" : "-EL") << " "
-<< (IsSF ? "+SF" : "-SF");
+<< "Selection failed for " << (IsEL ? "-EL" : "!EL") << " "
+<< (IsSF ? "-SF" : "!SF");
 
 std::string Suffix;
  

[PATCH] D151437: [NFC][Driver] Change MultilibBuilder interface

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rG47b431d6617d: [NFC][Driver] Change MultilibBuilder interface 
(authored by michaelplatings).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151437/new/

https://reviews.llvm.org/D151437

Files:
  clang/include/clang/Driver/MultilibBuilder.h
  clang/lib/Driver/MultilibBuilder.cpp
  clang/lib/Driver/ToolChains/BareMetal.cpp
  clang/lib/Driver/ToolChains/CommonArgs.cpp
  clang/lib/Driver/ToolChains/CommonArgs.h
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/OHOS.cpp
  clang/unittests/Driver/MultilibBuilderTest.cpp

Index: clang/unittests/Driver/MultilibBuilderTest.cpp
===
--- clang/unittests/Driver/MultilibBuilderTest.cpp
+++ clang/unittests/Driver/MultilibBuilderTest.cpp
@@ -27,20 +27,22 @@
 
   ASSERT_TRUE(MultilibBuilder().isValid()) << "Empty multilib is not valid";
 
-  ASSERT_TRUE(MultilibBuilder().flag("+foo").isValid())
+  ASSERT_TRUE(MultilibBuilder().flag(true, "-foo").isValid())
   << "Single indicative flag is not valid";
 
-  ASSERT_TRUE(MultilibBuilder().flag("-foo").isValid())
+  ASSERT_TRUE(MultilibBuilder().flag(false, "-foo").isValid())
   << "Single contraindicative flag is not valid";
 
-  ASSERT_FALSE(MultilibBuilder().flag("+foo").flag("-foo").isValid())
+  ASSERT_FALSE(
+  MultilibBuilder().flag(true, "-foo").flag(false, "-foo").isValid())
   << "Conflicting flags should invalidate the Multilib";
 
-  ASSERT_TRUE(MultilibBuilder().flag("+foo").flag("+foo").isValid())
+  ASSERT_TRUE(MultilibBuilder().flag(true, "-foo").flag(true, "-foo").isValid())
   << "Multilib should be valid even if it has the same flag "
  "twice";
 
-  ASSERT_TRUE(MultilibBuilder().flag("+foo").flag("-foobar").isValid())
+  ASSERT_TRUE(
+  MultilibBuilder().flag(true, "-foo").flag(false, "-foobar").isValid())
   << "Seemingly conflicting prefixes shouldn't actually conflict";
 }
 
@@ -52,7 +54,8 @@
 }
 
 TEST(MultilibBuilderTest, Construction3) {
-  MultilibBuilder M = MultilibBuilder().flag("+f1").flag("+f2").flag("-f3");
+  MultilibBuilder M =
+  MultilibBuilder().flag(true, "-f1").flag(true, "-f2").flag(false, "-f3");
   for (const std::string  : M.flags()) {
 ASSERT_TRUE(llvm::StringSwitch(A)
 .Cases("+f1", "+f2", "-f3", true)
@@ -63,7 +66,7 @@
 TEST(MultilibBuilderTest, SetConstruction1) {
   // Single maybe
   MultilibSet MS = MultilibSetBuilder()
-   .Maybe(MultilibBuilder("64").flag("+m64"))
+   .Maybe(MultilibBuilder("64").flag(true, "-m64"))
.makeMultilibSet();
   ASSERT_TRUE(MS.size() == 2);
   for (MultilibSet::const_iterator I = MS.begin(), E = MS.end(); I != E; ++I) {
@@ -79,8 +82,8 @@
 TEST(MultilibBuilderTest, SetConstruction2) {
   // Double maybe
   MultilibSet MS = MultilibSetBuilder()
-   .Maybe(MultilibBuilder("sof").flag("+sof"))
-   .Maybe(MultilibBuilder("el").flag("+EL"))
+   .Maybe(MultilibBuilder("sof").flag(true, "-sof"))
+   .Maybe(MultilibBuilder("el").flag(true, "-EL"))
.makeMultilibSet();
   ASSERT_TRUE(MS.size() == 4);
   for (MultilibSet::const_iterator I = MS.begin(), E = MS.end(); I != E; ++I) {
@@ -154,7 +157,7 @@
 
 TEST(MultilibBuilderTest, SetSelection1) {
   MultilibSet MS1 = MultilibSetBuilder()
-.Maybe(MultilibBuilder("64").flag("+m64"))
+.Maybe(MultilibBuilder("64").flag(true, "-m64"))
 .makeMultilibSet();
 
   Multilib::flags_list FlagM64 = {"+m64"};
@@ -174,8 +177,8 @@
 
 TEST(MultilibBuilderTest, SetSelection2) {
   MultilibSet MS2 = MultilibSetBuilder()
-.Maybe(MultilibBuilder("el").flag("+EL"))
-.Maybe(MultilibBuilder("sf").flag("+SF"))
+.Maybe(MultilibBuilder("el").flag(true, "-EL"))
+.Maybe(MultilibBuilder("sf").flag(true, "-SF"))
 .makeMultilibSet();
 
   for (unsigned I = 0; I < 4; ++I) {
Index: clang/lib/Driver/ToolChains/OHOS.cpp
===
--- clang/lib/Driver/ToolChains/OHOS.cpp
+++ clang/lib/Driver/ToolChains/OHOS.cpp
@@ -66,20 +66,20 @@
   bool IsA7 = false;
   if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
 IsA7 = A->getValue() == StringRef("cortex-a7");
-  addMultilibFlag(IsA7, "mcpu=cortex-a7", Flags);
+  addMultilibFlag(IsA7, "-mcpu=cortex-a7", Flags);
 
   bool IsMFPU = false;
   if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
 IsMFPU = A->getValue() == StringRef("neon-vfpv4");
-  addMultilibFlag(IsMFPU, "mfpu=neon-vfpv4", Flags);
+  addMultilibFlag(IsMFPU, "-mfpu=neon-vfpv4", Flags);
 
  

[clang] ce8fa36 - [NFC][Driver] Change Multilib flag representation

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-07T05:53:04+01:00
New Revision: ce8fa36e59e1995fde84730eeb460e06f42d7728

URL: 
https://github.com/llvm/llvm-project/commit/ce8fa36e59e1995fde84730eeb460e06f42d7728
DIFF: 
https://github.com/llvm/llvm-project/commit/ce8fa36e59e1995fde84730eeb460e06f42d7728.diff

LOG: [NFC][Driver] Change Multilib flag representation

This new representation means that a valid command line option may
potentially be used directly as a multilib flag without any translation.

To indicate that a flag is required not to be present, its first
character is replaced with '!', which is intended for consistency with
the logical not operator in many programming languages.

Reviewed By: simon_tatham

Differential Revision: https://reviews.llvm.org/D151438

Added: 


Modified: 
clang/include/clang/Driver/Multilib.h
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/Multilib.cpp
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Multilib.h 
b/clang/include/clang/Driver/Multilib.h
index 9d6f1d23696b8..bf284e26f9dad 100644
--- a/clang/include/clang/Driver/Multilib.h
+++ b/clang/include/clang/Driver/Multilib.h
@@ -58,7 +58,7 @@ class Multilib {
   const std::string () const { return IncludeSuffix; }
 
   /// Get the flags that indicate or contraindicate this multilib's use
-  /// All elements begin with either '+' or '-'
+  /// All elements begin with either '-' or '!'
   const flags_list () const { return Flags; }
 
   LLVM_DUMP_METHOD void dump() const;

diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index 177c8104f917b..86f34592ba384 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -70,7 +70,7 @@ class MultilibBuilder {
   MultilibBuilder (StringRef S);
 
   /// Get the flags that indicate or contraindicate this multilib's use
-  /// All elements begin with either '+' or '-'
+  /// All elements begin with either '-' or '!'
   const flags_list () const { return Flags; }
   flags_list () { return Flags; }
 

diff  --git a/clang/lib/Driver/Multilib.cpp b/clang/lib/Driver/Multilib.cpp
index 06bab74898616..5336c9ec57ec9 100644
--- a/clang/lib/Driver/Multilib.cpp
+++ b/clang/lib/Driver/Multilib.cpp
@@ -49,7 +49,7 @@ void Multilib::print(raw_ostream ) const {
   }
   OS << ";";
   for (StringRef Flag : Flags) {
-if (Flag.front() == '+')
+if (Flag.front() == '-')
   OS << "@" << Flag.substr(1);
   }
 }

diff  --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index 213f971f262f7..d2a3fcb3732f6 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -76,7 +76,7 @@ bool MultilibBuilder::isValid() const {
 StringRef Flag(Flags[I]);
 llvm::StringMap::iterator SI = FlagSet.find(Flag.substr(1));
 
-assert(StringRef(Flag).front() == '+' || StringRef(Flag).front() == '-');
+assert(StringRef(Flag).front() == '-' || StringRef(Flag).front() == '!');
 
 if (SI == FlagSet.end())
   FlagSet[Flag.substr(1)] = I;
@@ -97,10 +97,10 @@ Multilib MultilibBuilder::makeMultilib() const {
 
 MultilibSetBuilder ::Maybe(const MultilibBuilder ) {
   MultilibBuilder Opposite;
-  // Negate any '+' flags
+  // Negate positive flags
   for (StringRef Flag : M.flags()) {
-if (Flag.front() == '+')
-  Opposite.flags().push_back(("-" + Flag.substr(1)).str());
+if (Flag.front() == '-')
+  Opposite.flags().push_back(("!" + Flag.substr(1)).str());
   }
   return Either(M, Opposite);
 }

diff  --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp 
b/clang/lib/Driver/ToolChains/CommonArgs.cpp
index 403b17d1b2d62..165b1f9ae1300 100644
--- a/clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -1909,9 +1909,9 @@ void tools::addMultilibFlag(bool Enabled, const StringRef 
Flag,
 Multilib::flags_list ) {
   assert(Flag.front() == '-');
   if (Enabled) {
-Flags.push_back(("+" + Flag.substr(1)).str());
-  } else {
 Flags.push_back(Flag.str());
+  } else {
+Flags.push_back(("!" + Flag.substr(1)).str());
   }
 }
 

diff  --git a/clang/lib/Driver/ToolChains/OHOS.cpp 
b/clang/lib/Driver/ToolChains/OHOS.cpp
index 833204e1dc535..0fdcafe898d70 100644
--- a/clang/lib/Driver/ToolChains/OHOS.cpp
+++ b/clang/lib/Driver/ToolChains/OHOS.cpp
@@ -40,15 +40,15 @@ static bool findOHOSMuslMultilibs(const 
Multilib::flags_list ,
   // -mfloat-abi=soft -mfloat-abi=softfp -mfloat-abi=hard
   // -mfpu=neon-vfpv4
   Multilibs.push_back(
-  Multilib("/a7_soft", {}, {}, {"+mcpu=cortex-a7", "+mfloat-abi=soft"}));
+  Multilib("/a7_soft", {}, {}, 

[clang] 47b431d - [NFC][Driver] Change MultilibBuilder interface

2023-06-06 Thread Michael Platings via cfe-commits

Author: Michael Platings
Date: 2023-06-07T05:53:04+01:00
New Revision: 47b431d6617d5029e30370ec988e5087f65e2d6b

URL: 
https://github.com/llvm/llvm-project/commit/47b431d6617d5029e30370ec988e5087f65e2d6b
DIFF: 
https://github.com/llvm/llvm-project/commit/47b431d6617d5029e30370ec988e5087f65e2d6b.diff

LOG: [NFC][Driver] Change MultilibBuilder interface

Decouple the interface of the MultilibBuilder flag method from how flags
are stored internally. Likewise change the addMultilibFlag function.

Currently a multilib flag like "-fexceptions" means a multilib is
*incompatible* with the -fexceptions command line option, which is
counter-intuitive. This change is a step towards changing this scheme.

Differential Revision: https://reviews.llvm.org/D151437

Added: 


Modified: 
clang/include/clang/Driver/MultilibBuilder.h
clang/lib/Driver/MultilibBuilder.cpp
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/lib/Driver/ToolChains/CommonArgs.cpp
clang/lib/Driver/ToolChains/CommonArgs.h
clang/lib/Driver/ToolChains/Fuchsia.cpp
clang/lib/Driver/ToolChains/Gnu.cpp
clang/lib/Driver/ToolChains/OHOS.cpp
clang/unittests/Driver/MultilibBuilderTest.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/MultilibBuilder.h 
b/clang/include/clang/Driver/MultilibBuilder.h
index f4875f2e03f8a..177c8104f917b 100644
--- a/clang/include/clang/Driver/MultilibBuilder.h
+++ b/clang/include/clang/Driver/MultilibBuilder.h
@@ -75,18 +75,9 @@ class MultilibBuilder {
   flags_list () { return Flags; }
 
   /// Add a flag to the flags list
-  /// \p Flag must be a flag accepted by the driver with its leading '-'
-  /// removed,
-  /// and replaced with either:
-  ///   '-' which contraindicates using this multilib with that flag
-  /// or:
-  ///   '+' which promotes using this multilib in the presence of that flag
-  /// otherwise '-print-multi-lib' will not emit them correctly.
-  MultilibBuilder (StringRef F) {
-assert(F.front() == '+' || F.front() == '-');
-Flags.push_back(std::string(F));
-return *this;
-  }
+  /// \p Required defines whether the flag is required or disallowed.
+  /// \p Flag must be a flag accepted by the driver.
+  MultilibBuilder (bool Required, StringRef Flag);
 
   Multilib makeMultilib() const;
 

diff  --git a/clang/lib/Driver/MultilibBuilder.cpp 
b/clang/lib/Driver/MultilibBuilder.cpp
index f6351ae4b5278..213f971f262f7 100644
--- a/clang/lib/Driver/MultilibBuilder.cpp
+++ b/clang/lib/Driver/MultilibBuilder.cpp
@@ -7,6 +7,7 @@
 
//===--===//
 
 #include "clang/Driver/MultilibBuilder.h"
+#include "ToolChains/CommonArgs.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/Support/Path.h"
@@ -85,6 +86,11 @@ bool MultilibBuilder::isValid() const {
   return true;
 }
 
+MultilibBuilder ::flag(bool Required, StringRef Flag) {
+  tools::addMultilibFlag(Required, Flag, Flags);
+  return *this;
+}
+
 Multilib MultilibBuilder::makeMultilib() const {
   return Multilib(GCCSuffix, OSSuffix, IncludeSuffix, Flags);
 }

diff  --git a/clang/lib/Driver/ToolChains/BareMetal.cpp 
b/clang/lib/Driver/ToolChains/BareMetal.cpp
index 3232394007bc3..6726ec1c9b22e 100644
--- a/clang/lib/Driver/ToolChains/BareMetal.cpp
+++ b/clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -37,40 +37,42 @@ static bool findRISCVMultilibs(const Driver ,
   StringRef Abi = tools::riscv::getRISCVABI(Args, TargetTriple);
 
   if (TargetTriple.isRISCV64()) {
-MultilibBuilder Imac =
-MultilibBuilder().flag("+march=rv64imac").flag("+mabi=lp64");
+MultilibBuilder Imac = MultilibBuilder()
+   .flag(true, "-march=rv64imac")
+   .flag(true, "-mabi=lp64");
 MultilibBuilder Imafdc = MultilibBuilder("/rv64imafdc/lp64d")
- .flag("+march=rv64imafdc")
- .flag("+mabi=lp64d");
+ .flag(true, "-march=rv64imafdc")
+ .flag(true, "-mabi=lp64d");
 
 // Multilib reuse
 bool UseImafdc =
 (Arch == "rv64imafdc") || (Arch == "rv64gc"); // gc => imafdc
 
-addMultilibFlag((Arch == "rv64imac"), "march=rv64imac", Flags);
-addMultilibFlag(UseImafdc, "march=rv64imafdc", Flags);
-addMultilibFlag(Abi == "lp64", "mabi=lp64", Flags);
-addMultilibFlag(Abi == "lp64d", "mabi=lp64d", Flags);
+addMultilibFlag((Arch == "rv64imac"), "-march=rv64imac", Flags);
+addMultilibFlag(UseImafdc, "-march=rv64imafdc", Flags);
+addMultilibFlag(Abi == "lp64", "-mabi=lp64", Flags);
+addMultilibFlag(Abi == "lp64d", "-mabi=lp64d", Flags);
 
 Result.Multilibs =
 MultilibSetBuilder().Either(Imac, Imafdc).makeMultilibSet();
 return Result.Multilibs.select(Flags, Result.SelectedMultilib);
   }
   if 

[PATCH] D152070: [2/11][Clang][RISCV] Expand all variants of RVV intrinsic tuple types

2023-06-06 Thread Yueh-Ting (eop) Chen via Phabricator via cfe-commits
eopXD updated this revision to Diff 529152.
eopXD added a comment.

Bump CI based on change in parent revision.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152070/new/

https://reviews.llvm.org/D152070

Files:
  clang/include/clang/Basic/RISCVVTypes.def
  clang/include/clang/Support/RISCVVIntrinsicUtils.h
  clang/lib/Support/RISCVVIntrinsicUtils.cpp
  
clang/test/CodeGen/RISCV/rvv-intrinsics-handcrafted/rvv-intrinsic-datatypes.cpp
  clang/utils/TableGen/RISCVVEmitter.cpp

Index: clang/utils/TableGen/RISCVVEmitter.cpp
===
--- clang/utils/TableGen/RISCVVEmitter.cpp
+++ clang/utils/TableGen/RISCVVEmitter.cpp
@@ -156,6 +156,12 @@
   }
 }
 
+static VectorTypeModifier getTupleVTM(unsigned NF) {
+  assert(2 <= NF && NF <= 8 && "2 <= NF <= 8");
+  return static_cast(
+  static_cast(VectorTypeModifier::Tuple2) + (NF - 2));
+}
+
 void emitCodeGenSwitchBody(const RVVIntrinsic *RVVI, raw_ostream ) {
   if (!RVVI->getIRName().empty())
 OS << "  ID = Intrinsic::riscv_" + RVVI->getIRName() + ";\n";
@@ -364,15 +370,19 @@
 TypeModifier::UnsignedInteger));
 printType(*UT);
   }
-  // FIXME: Expand more type declaration
-  if (I == 'i' && Log2LMUL == 0) { // vint32m1x2_t
+  for (int NF = 2; NF <= 8; ++NF) {
 auto TupleT = TypeCache.computeType(
 BT, Log2LMUL,
-PrototypeDescriptor(BaseTypeModifier::Vector,
-VectorTypeModifier::Tuple2,
+PrototypeDescriptor(BaseTypeModifier::Vector, getTupleVTM(NF),
 TypeModifier::SignedInteger));
+auto TupleUT = TypeCache.computeType(
+BT, Log2LMUL,
+PrototypeDescriptor(BaseTypeModifier::Vector, getTupleVTM(NF),
+TypeModifier::UnsignedInteger));
 if (TupleT)
   printType(*TupleT);
+if (TupleUT)
+  printType(*TupleUT);
   }
 }
   }
@@ -383,6 +393,14 @@
   auto T = TypeCache.computeType(BT, Log2LMUL, PrototypeDescriptor::Vector);
   if (T)
 printType(*T);
+  for (int NF = 2; NF <= 8; ++NF) {
+auto TupleT = TypeCache.computeType(
+BT, Log2LMUL,
+PrototypeDescriptor(BaseTypeModifier::Vector, getTupleVTM(NF),
+TypeModifier::Float));
+if (TupleT)
+  printType(*TupleT);
+  }
 }
   }
 
Index: clang/test/CodeGen/RISCV/rvv-intrinsics-handcrafted/rvv-intrinsic-datatypes.cpp
===
--- clang/test/CodeGen/RISCV/rvv-intrinsics-handcrafted/rvv-intrinsic-datatypes.cpp
+++ clang/test/CodeGen/RISCV/rvv-intrinsics-handcrafted/rvv-intrinsic-datatypes.cpp
@@ -72,7 +72,232 @@
 // CHECK-NEXT:[[F64M2:%.*]] = alloca , align 8
 // CHECK-NEXT:[[F64M4:%.*]] = alloca , align 8
 // CHECK-NEXT:[[F64M8:%.*]] = alloca , align 8
+// CHECK-NEXT:[[I8MF8X2:%.*]] = alloca { ,  }, align 1
+// CHECK-NEXT:[[I8MF8X3:%.*]] = alloca { , ,  }, align 1
+// CHECK-NEXT:[[I8MF8X4:%.*]] = alloca { , , ,  }, align 1
+// CHECK-NEXT:[[I8MF8X5:%.*]] = alloca { , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF8X6:%.*]] = alloca { , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF8X7:%.*]] = alloca { , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF8X8:%.*]] = alloca { , , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X2:%.*]] = alloca { ,  }, align 1
+// CHECK-NEXT:[[I8MF4X3:%.*]] = alloca { , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X4:%.*]] = alloca { , , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X5:%.*]] = alloca { , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X6:%.*]] = alloca { , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X7:%.*]] = alloca { , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF4X8:%.*]] = alloca { , , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X2:%.*]] = alloca { ,  }, align 1
+// CHECK-NEXT:[[I8MF2X3:%.*]] = alloca { , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X4:%.*]] = alloca { , , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X5:%.*]] = alloca { , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X6:%.*]] = alloca { , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X7:%.*]] = alloca { , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8MF2X8:%.*]] = alloca { , , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8M1X2:%.*]] = alloca { ,  }, align 1
+// CHECK-NEXT:[[I8M1X3:%.*]] = alloca { , ,  }, align 1
+// CHECK-NEXT:[[I8M1X4:%.*]] = alloca { , , ,  }, align 1
+// CHECK-NEXT:[[I8M1X5:%.*]] = alloca { , , , ,  }, align 1
+// CHECK-NEXT:[[I8M1X6:%.*]] = alloca { , , , , ,  }, align 1
+// CHECK-NEXT:[[I8M1X7:%.*]] = alloca { , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8M1X8:%.*]] = alloca { , , , , , , ,  }, align 1
+// CHECK-NEXT:[[I8M2X2:%.*]] = alloca { ,  }, align 1
+// CHECK-NEXT:[[I8M2X3:%.*]] = alloca { , ,  }, align 1
+// 

[PATCH] D152069: [1/11][Clang][Type] Expand BuiltinTypeBits from 8 to 16 bits

2023-06-06 Thread Yueh-Ting (eop) Chen via Phabricator via cfe-commits
eopXD updated this revision to Diff 529151.
eopXD marked an inline comment as done.
eopXD added a comment.

Address comment from Erich.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152069/new/

https://reviews.llvm.org/D152069

Files:
  clang/include/clang/AST/Type.h


Index: clang/include/clang/AST/Type.h
===
--- clang/include/clang/AST/Type.h
+++ clang/include/clang/AST/Type.h
@@ -1649,7 +1649,7 @@
 unsigned : NumTypeBits;
 
 /// The kind (BuiltinType::Kind) of builtin type this is.
-unsigned Kind : 8;
+unsigned Kind : 9;
   };
 
   /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.


Index: clang/include/clang/AST/Type.h
===
--- clang/include/clang/AST/Type.h
+++ clang/include/clang/AST/Type.h
@@ -1649,7 +1649,7 @@
 unsigned : NumTypeBits;
 
 /// The kind (BuiltinType::Kind) of builtin type this is.
-unsigned Kind : 8;
+unsigned Kind : 9;
   };
 
   /// FunctionTypeBitfields store various bits belonging to FunctionProtoType.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151867: [Clang][RISCV] Make generic clz/ctz builtins defined for zero on RISCV targets.

2023-06-06 Thread Craig Topper via Phabricator via cfe-commits
craig.topper added a comment.

In D151867#4401952 , @Yunzezhu wrote:

> In D151867#4400255 , @craig.topper 
> wrote:
>
>> From the C language perspective with this change, __builtin_clz/ctz is still 
>> considered undefined for 0 and code that uses it is ill-formed. 
>> `isCLZForZeroUndef` is only intended to prevent the middle end from 
>> optimizing based on the undefinedness and creating surprises. See also 
>> https://discourse.llvm.org/t/should-ubsan-detect-0-input-to-builtin-clz-ctz-regardless-of-target/71060
>
> I see __builtin_clz/ctz returning an undefined value for 0 input matches 
> gcc's document, but when I test __builtin_clz/ctz with 0 input on gcc, it 
> returns a valid value rather than an undefined value. It looks gcc does not 
> follow gcc's document. I'm not sure which one is better that match document 
> to return undefined for 0, or match gcc's behavior to return defined value?

From what I can see in the assembly here https://godbolt.org/z/s4qqz83EK, gcc's 
undefined behavior sanitizer does consider an input of 0 to be undefined.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151867/new/

https://reviews.llvm.org/D151867

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


[PATCH] D151867: [Clang][RISCV] Make generic clz/ctz builtins defined for zero on RISCV targets.

2023-06-06 Thread Yunze Zhu(Thead) via Phabricator via cfe-commits
Yunzezhu added a comment.

In D151867#4400255 , @craig.topper 
wrote:

> From the C language perspective with this change, __builtin_clz/ctz is still 
> considered undefined for 0 and code that uses it is ill-formed. 
> `isCLZForZeroUndef` is only intended to prevent the middle end from 
> optimizing based on the undefinedness and creating surprises. See also 
> https://discourse.llvm.org/t/should-ubsan-detect-0-input-to-builtin-clz-ctz-regardless-of-target/71060

I see __builtin_clz/ctz returning an undefined value for 0 input matches gcc's 
document, but when I test __builtin_clz/ctz with 0 input on gcc, it returns a 
valid value rather than an undefined value. It looks gcc does not follow gcc's 
document. I'm not sure which one is better that match document to return 
undefined for 0, or match gcc's behavior to return defined value?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151867/new/

https://reviews.llvm.org/D151867

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


[PATCH] D152197: Fix static analyzer bugs with null pointer dereferences in CheckSizelessVectorOperands()

2023-06-06 Thread Soumi Manna via Phabricator via cfe-commits
Manna marked an inline comment as done.
Manna added inline comments.



Comment at: clang/lib/Sema/SemaExpr.cpp:11148
   if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() &&
   Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
   Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {

erichkeane wrote:
> This is the only other use of htem, but the 1st part of the 'if' checks if 
> these are builtin types.  
Thanks for the comments. I have added nullptr checks for LHSBuiltinTy  and 
RHSBuiltinTy before using them to getBuiltinVectorTypeInfo() which dereferences.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152197/new/

https://reviews.llvm.org/D152197

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


[PATCH] D152197: Fix static analyzer bugs with null pointer dereferences in CheckSizelessVectorOperands()

2023-06-06 Thread Soumi Manna via Phabricator via cfe-commits
Manna updated this revision to Diff 529138.
Manna retitled this revision from "[NFC][CLANG] Fix static analyzer bugs with 
null pointer dereferences in CheckSizelessVectorOperands()" to "Fix static 
analyzer bugs with null pointer dereferences in CheckSizelessVectorOperands()".
Manna edited the summary of this revision.
Manna added a comment.

Thank you @erichkeane and @sdesmalen for reviews and feedbacks.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152197/new/

https://reviews.llvm.org/D152197

Files:
  clang/lib/Sema/SemaExpr.cpp


Index: clang/lib/Sema/SemaExpr.cpp
===
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -11145,6 +11145,7 @@
   }
 
   if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() &&
+  LHSBuiltinTy && RHSBuiltinTy &&
   Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
   Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)


Index: clang/lib/Sema/SemaExpr.cpp
===
--- clang/lib/Sema/SemaExpr.cpp
+++ clang/lib/Sema/SemaExpr.cpp
@@ -11145,6 +11145,7 @@
   }
 
   if (LHSType->isVLSTBuiltinType() && RHSType->isVLSTBuiltinType() &&
+  LHSBuiltinTy && RHSBuiltinTy &&
   Context.getBuiltinVectorTypeInfo(LHSBuiltinTy).EC !=
   Context.getBuiltinVectorTypeInfo(RHSBuiltinTy).EC) {
 Diag(Loc, diag::err_typecheck_vector_lengths_not_equal)
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D152335: [Clang] Add check to Sema::AddAlignedAttr to verify active bits is not out of range

2023-06-06 Thread Shafik Yaghmour via Phabricator via cfe-commits
shafik created this revision.
shafik added reviewers: aaron.ballman, erichkeane.
Herald added a project: All.
shafik requested review of this revision.

If we provide too large a value for the alignment attribute 
`APInt::getZExtValue()` will assert. This PR adds a active bits check and folds 
it into the `MaximumAlignment` check.

This fixes: https://github.com/llvm/llvm-project/issues/50534


https://reviews.llvm.org/D152335

Files:
  clang/lib/Sema/SemaDeclAttr.cpp
  clang/test/Sema/attr-aligned.c


Index: clang/test/Sema/attr-aligned.c
===
--- clang/test/Sema/attr-aligned.c
+++ clang/test/Sema/attr-aligned.c
@@ -1,8 +1,10 @@
-// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fsyntax-only -verify %s
 
 int x __attribute__((aligned(3))); // expected-error {{requested alignment is 
not a power of 2}}
 int y __attribute__((aligned(1ull << 33))); // expected-error {{requested 
alignment must be 4294967296 bytes or smaller}}
 int y __attribute__((aligned(1ull << 32)));
+// GH50534
+int z __attribute__((aligned((__int128_t)0x1234567890abcde0ULL << 64))); // 
expected-error {{requested alignment must be 4294967296 bytes or smaller}}
 
 // PR26444
 int y __attribute__((aligned(1 << 29)));
Index: clang/lib/Sema/SemaDeclAttr.cpp
===
--- clang/lib/Sema/SemaDeclAttr.cpp
+++ clang/lib/Sema/SemaDeclAttr.cpp
@@ -4473,24 +4473,30 @@
   if (ICE.isInvalid())
 return;
 
-  uint64_t AlignVal = Alignment.getZExtValue();
-  // C++11 [dcl.align]p2:
-  //   -- if the constant expression evaluates to zero, the alignment
-  //  specifier shall have no effect
-  // C11 6.7.5p6:
-  //   An alignment specification of zero has no effect.
-  if (!(TmpAttr.isAlignas() && !Alignment)) {
-if (!llvm::isPowerOf2_64(AlignVal)) {
-  Diag(AttrLoc, diag::err_alignment_not_power_of_two)
-<< E->getSourceRange();
-  return;
-}
-  }
 
   uint64_t MaximumAlignment = Sema::MaximumAlignment;
   if (Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
 MaximumAlignment = std::min(MaximumAlignment, uint64_t(8192));
-  if (AlignVal > MaximumAlignment) {
+  bool TooManyActiveBits = Alignment.getActiveBits() > llvm::APInt(64, 
MaximumAlignment).getActiveBits();
+
+  uint64_t AlignVal = 0;
+  if (!TooManyActiveBits) {
+AlignVal = Alignment.getZExtValue();
+// C++11 [dcl.align]p2:
+//   -- if the constant expression evaluates to zero, the alignment
+//  specifier shall have no effect
+// C11 6.7.5p6:
+//   An alignment specification of zero has no effect.
+if (!(TmpAttr.isAlignas() && !Alignment)) {
+  if (!llvm::isPowerOf2_64(AlignVal)) {
+Diag(AttrLoc, diag::err_alignment_not_power_of_two)
+  << E->getSourceRange();
+return;
+  }
+}
+  }
+
+  if (TooManyActiveBits || AlignVal > MaximumAlignment) {
 Diag(AttrLoc, diag::err_attribute_aligned_too_great)
 << MaximumAlignment << E->getSourceRange();
 return;


Index: clang/test/Sema/attr-aligned.c
===
--- clang/test/Sema/attr-aligned.c
+++ clang/test/Sema/attr-aligned.c
@@ -1,8 +1,10 @@
-// RUN: %clang_cc1 -triple i386-apple-darwin9 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin9 -fsyntax-only -verify %s
 
 int x __attribute__((aligned(3))); // expected-error {{requested alignment is not a power of 2}}
 int y __attribute__((aligned(1ull << 33))); // expected-error {{requested alignment must be 4294967296 bytes or smaller}}
 int y __attribute__((aligned(1ull << 32)));
+// GH50534
+int z __attribute__((aligned((__int128_t)0x1234567890abcde0ULL << 64))); // expected-error {{requested alignment must be 4294967296 bytes or smaller}}
 
 // PR26444
 int y __attribute__((aligned(1 << 29)));
Index: clang/lib/Sema/SemaDeclAttr.cpp
===
--- clang/lib/Sema/SemaDeclAttr.cpp
+++ clang/lib/Sema/SemaDeclAttr.cpp
@@ -4473,24 +4473,30 @@
   if (ICE.isInvalid())
 return;
 
-  uint64_t AlignVal = Alignment.getZExtValue();
-  // C++11 [dcl.align]p2:
-  //   -- if the constant expression evaluates to zero, the alignment
-  //  specifier shall have no effect
-  // C11 6.7.5p6:
-  //   An alignment specification of zero has no effect.
-  if (!(TmpAttr.isAlignas() && !Alignment)) {
-if (!llvm::isPowerOf2_64(AlignVal)) {
-  Diag(AttrLoc, diag::err_alignment_not_power_of_two)
-<< E->getSourceRange();
-  return;
-}
-  }
 
   uint64_t MaximumAlignment = Sema::MaximumAlignment;
   if (Context.getTargetInfo().getTriple().isOSBinFormatCOFF())
 MaximumAlignment = std::min(MaximumAlignment, uint64_t(8192));
-  if (AlignVal > MaximumAlignment) {
+  bool TooManyActiveBits = Alignment.getActiveBits() > llvm::APInt(64, 

[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Deniz Evrenci via Phabricator via cfe-commits
denizevrenci updated this revision to Diff 529140.
denizevrenci added a comment.

Sort tests out a bit more


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

Files:
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h
  clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
  
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
@@ -0,0 +1,36 @@
+// RUN: %check_clang_tidy -std=c++11,c++14,c++17,c++20 %s bugprone-exception-escape %t -- \
+// RUN: -- -fexceptions
+
+void rethrower() {
+throw;
+}
+
+void callsRethrower() {
+rethrower();
+}
+
+void callsRethrowerNoexcept() noexcept {
+rethrower();
+}
+
+int throwsAndCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+rethrower();
+}
+}
+
+int throwsAndCallsCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+callsRethrower();
+}
+}
+
+void rethrowerNoexcept() noexcept {
+throw;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
@@ -36,17 +36,18 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise;
 
 template <
 typename T, bool ThrowInTaskConstructor = false,
 bool ThrowInPromiseConstructor = false, bool ThrowInInitialSuspend = false,
-bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false>
+bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false,
+bool RethrowInUnhandledException = false>
 struct Task {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -67,13 +68,13 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Task {
+ThrowInUnhandledException, RethrowInUnhandledException> {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -92,7 +93,7 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
@@ -130,6 +131,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -138,9 +141,9 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
+   ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException> {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
   throw 1;
@@ -170,6 +173,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -266,6 +271,33 @@
   co_return a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_return a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_return a / b;
+}
+
+Task
+j_ShouldNotDiag(const int a, const int b) {
+  if (b == 0)
+throw b;
+
+  co_return a / b;
+}
+
+Task
+j_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: an exception may be thrown in function 'j_ShouldDiag' which should not throw exceptions
+  if (b == 0)
+throw b;
+
+  co_return a / b;
+}
+
 } // namespace coreturn
 
 namespace coyield {
@@ -347,6 +379,33 @@
   co_yield a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_yield a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_yield a / b;
+}
+
+Task
+j_ShouldNotDiag(const int a, const int b) {
+  if (b == 0)
+throw b;
+
+  co_yield a / b;
+}
+
+Task
+j_ShouldDiag(const 

[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Deniz Evrenci via Phabricator via cfe-commits
denizevrenci updated this revision to Diff 529137.
denizevrenci added a comment.

Sort out tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

Files:
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h
  clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
  
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
@@ -0,0 +1,36 @@
+// RUN: %check_clang_tidy -std=c++11,c++14,c++17,c++20 %s bugprone-exception-escape %t -- \
+// RUN: -- -fexceptions
+
+void rethrower() {
+throw;
+}
+
+void callsRethrower() {
+rethrower();
+}
+
+void callsRethrowerNoexcept() noexcept {
+rethrower();
+}
+
+int throwsAndCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+rethrower();
+}
+}
+
+int throwsAndCallsCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+callsRethrower();
+}
+}
+
+void rethrowerNoexcept() noexcept {
+throw;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
@@ -36,17 +36,18 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise;
 
 template <
 typename T, bool ThrowInTaskConstructor = false,
 bool ThrowInPromiseConstructor = false, bool ThrowInInitialSuspend = false,
-bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false>
+bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false,
+bool RethrowInUnhandledException = false>
 struct Task {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -67,13 +68,13 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Task {
+ThrowInUnhandledException, RethrowInUnhandledException> {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -92,7 +93,7 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
@@ -130,6 +131,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -138,9 +141,9 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
+   ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException> {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
   throw 1;
@@ -170,6 +173,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -266,6 +271,29 @@
   co_return a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_return a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_return a / b;
+}
+
+Task
+j_ShouldNotDiag(const int a, const int b) {
+  throw 1;
+  co_return a / b;
+}
+
+Task
+j_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: an exception may be thrown in function 'j_ShouldDiag' which should not throw exceptions
+  throw 1;
+  co_return a / b;
+}
+
 } // namespace coreturn
 
 namespace coyield {
@@ -347,6 +375,29 @@
   co_yield a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_yield a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_yield a / b;
+}
+
+Task
+j_ShouldNotDiag(const int a, const int b) {
+  throw 1;
+  co_yield a / b;
+}
+
+Task
+j_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: 

[PATCH] D152269: [StaticAnalyzer] Fix false negative on NilArgChecker when creating literal object

2023-06-06 Thread tripleCC via Phabricator via cfe-commits
tripleCC added inline comments.



Comment at: 
clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp:151-164
+  auto ArgSVal = C.getSVal(E).getAs();
+  if (!ArgSVal)
+return;
+
+  ProgramStateRef StNonNull, StNull;
+  std::tie(StNonNull, StNull) = State->assume(*ArgSVal);
+

steakhal wrote:
> steakhal wrote:
> > This means that we would raise an issue if `ArgSVal` might be null. We 
> > usually warn if we are sure there is a bug, aka. if it must be null. 
> > Consequently, the condition should be rather `StNull && !StNonNull` instead 
> > of just `StNull`.
> Ah I see now. My bad, thats the whole point of this :D
Not exactly, this meas that if ArgSVal might be null, we dispatch an "implicit" 
null event to NullabilityChecker. NullabilityChecker would emit a warning if 
the pointer is nullable  in `checkEvent` function:

```c++
/// This callback triggers when a pointer is dereferenced and the analyzer does
/// not know anything about the value of that pointer. When that pointer is
/// nullable, this code emits a warning.
void NullabilityChecker::checkEvent(ImplicitNullDerefEvent Event) const {
  if (Event.SinkNode->getState()->get())
return;

  const MemRegion *Region =
  getTrackRegion(Event.Location, /*CheckSuperRegion=*/true);
  if (!Region)
return;

  ProgramStateRef State = Event.SinkNode->getState();
  const NullabilityState *TrackedNullability =
  State->get(Region);

  if (!TrackedNullability)
return;

  if (ChecksEnabled[CK_NullableDereferenced] &&
  TrackedNullability->getValue() == Nullability::Nullable) {
BugReporter  = *Event.BR;
// Do not suppress errors on defensive code paths, because dereferencing
// a nullable pointer is always an error.
if (Event.IsDirectDereference)
  reportBug("Nullable pointer is dereferenced",
ErrorKind::NullableDereferenced, CK_NullableDereferenced,
Event.SinkNode, Region, BR);
else {
  reportBug("Nullable pointer is passed to a callee that requires a "
"non-null",
ErrorKind::NullablePassedToNonnull, CK_NullableDereferenced,
Event.SinkNode, Region, BR);
}
  }
}
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152269/new/

https://reviews.llvm.org/D152269

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


[PATCH] D152194: [StaticAnalyzer] Fix nullptr dereference issue found by static analyzer tool

2023-06-06 Thread Soumi Manna via Phabricator via cfe-commits
Manna updated this revision to Diff 529133.
Manna retitled this revision from "[NFC][CLANG] Fix nullptr dereference issue 
found by static analyzer tool" to "[StaticAnalyzer] Fix nullptr dereference 
issue found by static analyzer tool".
Manna edited the summary of this revision.
Manna added a comment.
Herald added a subscriber: szepet.

Thank you @erichkeane and @steakhal for reviews and feedbacks. I have updated 
patch to address your review comments.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152194/new/

https://reviews.llvm.org/D152194

Files:
  clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp


Index: clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
+++ clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
@@ -742,8 +742,6 @@
   const ObjCMethodDecl *Method = nullptr;
 
   QualType ReceiverType = MessageExpr->getReceiverType();
-  const auto *ReceiverObjectPtrType =
-  ReceiverType->getAs();
 
   // Do this "devirtualization" on instance and class methods only. Trust the
   // static type on super and super class calls.
@@ -753,7 +751,8 @@
 // type, look up the method in the tracked type, not in the receiver type.
 // This way we preserve more information.
 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType() ||
-ASTCtxt.canAssignObjCInterfaces(ReceiverObjectPtrType, TrackedType)) {
+ASTCtxt.canAssignObjCInterfaces(
+ReceiverType->castAs(), TrackedType)) {
   const ObjCInterfaceDecl *InterfaceDecl = TrackedType->getInterfaceDecl();
   // The method might not be found.
   Selector Sel = MessageExpr->getSelector();


Index: clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
+++ clang/lib/StaticAnalyzer/Checkers/DynamicTypePropagation.cpp
@@ -742,8 +742,6 @@
   const ObjCMethodDecl *Method = nullptr;
 
   QualType ReceiverType = MessageExpr->getReceiverType();
-  const auto *ReceiverObjectPtrType =
-  ReceiverType->getAs();
 
   // Do this "devirtualization" on instance and class methods only. Trust the
   // static type on super and super class calls.
@@ -753,7 +751,8 @@
 // type, look up the method in the tracked type, not in the receiver type.
 // This way we preserve more information.
 if (ReceiverType->isObjCIdType() || ReceiverType->isObjCClassType() ||
-ASTCtxt.canAssignObjCInterfaces(ReceiverObjectPtrType, TrackedType)) {
+ASTCtxt.canAssignObjCInterfaces(
+ReceiverType->castAs(), TrackedType)) {
   const ObjCInterfaceDecl *InterfaceDecl = TrackedType->getInterfaceDecl();
   // The method might not be found.
   Selector Sel = MessageExpr->getSelector();
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Deniz Evrenci via Phabricator via cfe-commits
denizevrenci updated this revision to Diff 529134.
denizevrenci added a comment.

Rebase on main


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

Files:
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h
  clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
  
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
@@ -0,0 +1,36 @@
+// RUN: %check_clang_tidy -std=c++11,c++14,c++17,c++20 %s bugprone-exception-escape %t -- \
+// RUN: -- -fexceptions
+
+void rethrower() {
+throw;
+}
+
+void callsRethrower() {
+rethrower();
+}
+
+void callsRethrowerNoexcept() noexcept {
+rethrower();
+}
+
+int throwsAndCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+rethrower();
+}
+}
+
+int throwsAndCallsCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+callsRethrower();
+}
+}
+
+void rethrowerNoexcept() noexcept {
+throw;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
@@ -36,17 +36,18 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise;
 
 template <
 typename T, bool ThrowInTaskConstructor = false,
 bool ThrowInPromiseConstructor = false, bool ThrowInInitialSuspend = false,
-bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false>
+bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false,
+bool RethrowInUnhandledException = false>
 struct Task {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -67,13 +68,13 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Task {
+ThrowInUnhandledException, RethrowInUnhandledException> {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -92,7 +93,7 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
@@ -130,6 +131,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -138,9 +141,9 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
+   ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException> {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
   throw 1;
@@ -170,6 +173,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -266,6 +271,23 @@
   co_return a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_return a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_return a / b;
+}
+
+Task
+i_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: an exception may be thrown in function 'i_ShouldDiag' which should not throw exceptions
+  throw 1;
+  co_return a / b;
+}
+
 } // namespace coreturn
 
 namespace coyield {
@@ -347,6 +369,23 @@
   co_yield a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_yield a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_yield a / b;
+}
+
+Task
+i_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: an exception may be thrown in function 'i_ShouldDiag' which should not throw exceptions
+  throw 1;
+  co_yield a / b;
+}
+
 } // namespace coyield
 
 namespace 

[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Chuanqi Xu via Phabricator via cfe-commits
ChuanqiXu accepted this revision.
ChuanqiXu added a comment.
This revision is now accepted and ready to land.

LGTM. And please wait for several days for other reviewers.




Comment at: 
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp:132-136
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }

denizevrenci wrote:
> ChuanqiXu wrote:
> > I don't know clang-tidy a lot. But is these two branches different in 
> > clang-tidy really?
> Yes, rethrows are handled differently than throw expressions with arguments. 
> You can find the relevant implementation in ExceptionAnalyzer.cpp:[462:475].
OK, sounds good to me. 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

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


[PATCH] D152285: Add support for the NO_COLOR environment variable

2023-06-06 Thread Shafik Yaghmour via Phabricator via cfe-commits
shafik added a comment.

`CLICOLOR/CLICOLOR_FORCE` seems a lot more complicated, `NO-COLOR` feels like a 
win for low cost and does not preclude supporting others later on if we feel 
there is a need. So LGTM but I would like to see more feedback.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152285/new/

https://reviews.llvm.org/D152285

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


[PATCH] D152274: [clang] Don't create import decls without -fmodules

2023-06-06 Thread Chuanqi Xu via Phabricator via cfe-commits
ChuanqiXu added inline comments.



Comment at: clang/test/Modules/getSourceDescriptor-crash.cpp:2
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -I %S/Inputs/getSourceDescriptor-crash -S -emit-llvm 
-debug-info-kind=limited -debugger-tuning=lldb -fmodules 
-fmodules-cache-path=%t -fimplicit-module-maps %s -o - | FileCheck %s
 

It is better to use `split-file`. You can find the examples by searching in the 
same dir.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152274/new/

https://reviews.llvm.org/D152274

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


[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Deniz Evrenci via Phabricator via cfe-commits
denizevrenci added inline comments.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp:132-136
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }

ChuanqiXu wrote:
> I don't know clang-tidy a lot. But is these two branches different in 
> clang-tidy really?
Yes, rethrows are handled differently than throw expressions with arguments. 
You can find the relevant implementation in ExceptionAnalyzer.cpp:[462:475].


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

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


[PATCH] D152269: [StaticAnalyzer] Fix false negative on NilArgChecker when creating literal object

2023-06-06 Thread tripleCC via Phabricator via cfe-commits
tripleCC added inline comments.



Comment at: clang/test/Analysis/NSContainers.m:336-337
+void testCreateArrayLiteralWithNullableArg() {
+  (void)@[getNonnullFoo()]; // no warning
+  (void)@[getNullableFoo()]; // expected-warning {{Nullable pointer is passed 
to a callee that requires a non-null}}
+}

steakhal wrote:
> How about the case when it calls a `Foo * getMightBeNullFoo();`? I guess, it 
> would still raise an issue, even though we couldn't prove that it must be 
> null.
I have added the `Foo * getMightBeNullFoo();` test case. It would not raise an 
issue actually because without tracked nullability, the NullabilityChecker does 
not produce warnings. You can check the logic in the  checkEvent function for 
this part


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152269/new/

https://reviews.llvm.org/D152269

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


[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Chuanqi Xu via Phabricator via cfe-commits
ChuanqiXu added inline comments.



Comment at: 
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp:132-136
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }

I don't know clang-tidy a lot. But is these two branches different in 
clang-tidy really?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152330/new/

https://reviews.llvm.org/D152330

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


[clang] d4c5b45 - [NFC] Remove unneeded semicolon after function definition

2023-06-06 Thread Jim Lin via cfe-commits

Author: Jim Lin
Date: 2023-06-07T09:29:49+08:00
New Revision: d4c5b452934a31f9b3685cf58bd682104b686d1a

URL: 
https://github.com/llvm/llvm-project/commit/d4c5b452934a31f9b3685cf58bd682104b686d1a
DIFF: 
https://github.com/llvm/llvm-project/commit/d4c5b452934a31f9b3685cf58bd682104b686d1a.diff

LOG: [NFC] Remove unneeded semicolon after function definition

Added: 


Modified: 
clang/lib/Tooling/Transformer/Stencil.cpp
lldb/source/Plugins/Architecture/AArch64/ArchitectureAArch64.h
llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
llvm/include/llvm/Object/GOFFObjectFile.h
llvm/lib/Target/CSKY/CSKYAsmPrinter.h
llvm/lib/Target/SPIRV/MCTargetDesc/SPIRVTargetStreamer.h
llvm/lib/Target/X86/MCTargetDesc/X86MCExpr.h
llvm/unittests/Transforms/Vectorize/VPlanTest.cpp

Removed: 




diff  --git a/clang/lib/Tooling/Transformer/Stencil.cpp 
b/clang/lib/Tooling/Transformer/Stencil.cpp
index 2198aefddc9f1..f2c1b6f8520a8 100644
--- a/clang/lib/Tooling/Transformer/Stencil.cpp
+++ b/clang/lib/Tooling/Transformer/Stencil.cpp
@@ -327,7 +327,7 @@ class SelectBoundStencil : public 
clang::transformer::StencilInterface {
 assert(containsNoNullStencils(CaseStencils) &&
"cases of selectBound may not be null");
   }
-  ~SelectBoundStencil() override{};
+  ~SelectBoundStencil() override {}
 
   llvm::Error eval(const MatchFinder::MatchResult ,
std::string *result) const override {

diff  --git a/lldb/source/Plugins/Architecture/AArch64/ArchitectureAArch64.h 
b/lldb/source/Plugins/Architecture/AArch64/ArchitectureAArch64.h
index e1b8558e1cda0..da0b867fb1e9b 100644
--- a/lldb/source/Plugins/Architecture/AArch64/ArchitectureAArch64.h
+++ b/lldb/source/Plugins/Architecture/AArch64/ArchitectureAArch64.h
@@ -22,7 +22,7 @@ class ArchitectureAArch64 : public Architecture {
 
   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
 
-  void OverrideStopInfo(Thread ) const override{};
+  void OverrideStopInfo(Thread ) const override {}
 
   const MemoryTagManager *GetMemoryTagManager() const override {
 return _memory_tag_manager;

diff  --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h 
b/llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
index 035c5a08feefd..eff87c5617d99 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelKnownBits.h
@@ -93,10 +93,10 @@ class GISelKnownBits : public GISelChangeObserver {
   Align computeKnownAlignment(Register R, unsigned Depth = 0);
 
   // Observer API. No-op for non-caching implementation.
-  void erasingInstr(MachineInstr ) override{};
-  void createdInstr(MachineInstr ) override{};
-  void changingInstr(MachineInstr ) override{};
-  void changedInstr(MachineInstr ) override{};
+  void erasingInstr(MachineInstr ) override {}
+  void createdInstr(MachineInstr ) override {}
+  void changingInstr(MachineInstr ) override {}
+  void changedInstr(MachineInstr ) override {}
 
 protected:
   unsigned getMaxDepth() const { return MaxDepth; }

diff  --git a/llvm/include/llvm/Object/GOFFObjectFile.h 
b/llvm/include/llvm/Object/GOFFObjectFile.h
index 37b6b1ec659a0..c39a9dee98d14 100644
--- a/llvm/include/llvm/Object/GOFFObjectFile.h
+++ b/llvm/include/llvm/Object/GOFFObjectFile.h
@@ -82,7 +82,7 @@ class GOFFObjectFile : public ObjectFile {
   bool isSymbolIndirect(DataRefImpl Symb) const;
 
   // SectionRef.
-  void moveSectionNext(DataRefImpl ) const override{};
+  void moveSectionNext(DataRefImpl ) const override {}
   virtual Expected getSectionName(DataRefImpl Sec) const override {
 return StringRef();
   }
@@ -112,7 +112,7 @@ class GOFFObjectFile : public ObjectFile {
   const uint8_t *getSectionPrEsdRecord(uint32_t SectionIndex) const;
 
   // RelocationRef.
-  void moveRelocationNext(DataRefImpl ) const override{};
+  void moveRelocationNext(DataRefImpl ) const override {}
   uint64_t getRelocationOffset(DataRefImpl Rel) const override { return 0; }
   symbol_iterator getRelocationSymbol(DataRefImpl Rel) const override {
 DataRefImpl Temp;
@@ -120,7 +120,7 @@ class GOFFObjectFile : public ObjectFile {
   }
   uint64_t getRelocationType(DataRefImpl Rel) const override { return 0; }
   void getRelocationTypeName(DataRefImpl Rel,
- SmallVectorImpl ) const override{};
+ SmallVectorImpl ) const override {}
 };
 
 } // namespace object

diff  --git a/llvm/lib/Target/CSKY/CSKYAsmPrinter.h 
b/llvm/lib/Target/CSKY/CSKYAsmPrinter.h
index 5e87594e4fdf1..379189512405a 100644
--- a/llvm/lib/Target/CSKY/CSKYAsmPrinter.h
+++ b/llvm/lib/Target/CSKY/CSKYAsmPrinter.h
@@ -57,7 +57,7 @@ class LLVM_LIBRARY_VISIBILITY CSKYAsmPrinter : public 
AsmPrinter {
   bool runOnMachineFunction(MachineFunction ) override;
 
   // we emit constant pools customly!
-  void emitConstantPool() override{};
+  void 

[PATCH] D152330: [clang-tidy] Check functions called from catch blocks

2023-06-06 Thread Deniz Evrenci via Phabricator via cfe-commits
denizevrenci created this revision.
denizevrenci added reviewers: njames93, PiotrZSL, ChuanqiXu.
Herald added subscribers: carlosgalvezp, xazax.hun.
Herald added a project: All.
denizevrenci requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.

These functions can rethrow a current exception that is caught by the
catch block. We can pass the currently caught excections to the function
declaration analyzer just like the statement analyzer to handle this
case.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152330

Files:
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.cpp
  clang-tools-extra/clang-tidy/utils/ExceptionAnalyzer.h
  clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
  
clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp

Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
===
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-rethrow.cpp
@@ -0,0 +1,36 @@
+// RUN: %check_clang_tidy -std=c++11,c++14,c++17,c++20 %s bugprone-exception-escape %t -- \
+// RUN: -- -fexceptions
+
+void rethrower() {
+throw;
+}
+
+void callsRethrower() {
+rethrower();
+}
+
+void callsRethrowerNoexcept() noexcept {
+rethrower();
+}
+
+int throwsAndCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+rethrower();
+}
+}
+
+int throwsAndCallsCallsRethrower() noexcept {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'throwsAndCallsCallsRethrower' which should not throw exceptions
+try {
+throw 1;
+} catch(...) {
+callsRethrower();
+}
+}
+
+void rethrowerNoexcept() noexcept {
+throw;
+}
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
===
--- clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/bugprone/exception-escape-coro.cpp
@@ -36,17 +36,18 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise;
 
 template <
 typename T, bool ThrowInTaskConstructor = false,
 bool ThrowInPromiseConstructor = false, bool ThrowInInitialSuspend = false,
-bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false>
+bool ThrowInGetReturnObject = false, bool ThrowInUnhandledException = false,
+bool RethrowInUnhandledException = false>
 struct Task {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -67,13 +68,13 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Task {
+ThrowInUnhandledException, RethrowInUnhandledException> {
   using promise_type =
   Promise;
+  ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException>;
 
   explicit Task(promise_type ) {
 if constexpr (ThrowInTaskConstructor) {
@@ -92,7 +93,7 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
@@ -130,6 +131,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -138,9 +141,9 @@
 
 template 
+  bool ThrowInUnhandledException, bool RethrowInUnhandledException>
 struct Promise {
+   ThrowInGetReturnObject, ThrowInUnhandledException, RethrowInUnhandledException> {
   Promise() {
 if constexpr (ThrowInPromiseConstructor) {
   throw 1;
@@ -170,6 +173,8 @@
   void unhandled_exception() {
 if constexpr (ThrowInUnhandledException) {
   throw 1;
+} else if constexpr (RethrowInUnhandledException) {
+  throw;
 }
   }
 
@@ -266,6 +271,23 @@
   co_return a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_return a / b;
+}
+
+Task
+i_ShouldNotDiagNoexcept(const int a, const int b) noexcept {
+  co_return a / b;
+}
+
+Task
+i_ShouldDiag(const int a, const int b) noexcept {
+  // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: an exception may be thrown in function 'i_ShouldDiag' which should not throw exceptions
+  throw 1;
+  co_return a / b;
+}
+
 } // namespace coreturn
 
 namespace coyield {
@@ -347,6 +369,23 @@
   co_yield a / b;
 }
 
+Task
+i_ShouldNotDiag(const int a, const int b) {
+  co_yield a / b;
+}
+

[PATCH] D152269: [StaticAnalyzer] Fix false negative on NilArgChecker when creating literal object

2023-06-06 Thread tripleCC via Phabricator via cfe-commits
tripleCC updated this revision to Diff 529116.
tripleCC added a comment.

[StaticAnalyzer] add might be null test case for NilArgChecker


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152269/new/

https://reviews.llvm.org/D152269

Files:
  clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
  clang/test/Analysis/NSContainers.m


Index: clang/test/Analysis/NSContainers.m
===
--- clang/test/Analysis/NSContainers.m
+++ clang/test/Analysis/NSContainers.m
@@ -1,4 +1,4 @@
-// RUN: %clang_analyze_cc1  -Wno-objc-literal-conversion 
-analyzer-checker=core,osx.cocoa.NonNilReturnValue,osx.cocoa.NilArg,osx.cocoa.Loops,debug.ExprInspection
 -verify -Wno-objc-root-class %s
+// RUN: %clang_analyze_cc1 -Wno-objc-literal-conversion 
-analyzer-checker=core,osx.cocoa.NonNilReturnValue,osx.cocoa.NilArg,osx.cocoa.Loops,debug.ExprInspection,nullability
 -verify -Wno-objc-root-class %s
 
 void clang_analyzer_eval(int);
 
@@ -323,3 +323,19 @@
   // that 'obj' can be nil in this context.
   dict[obj] = getStringFromString(obj); // no-warning
 }
+
+Foo * _Nonnull getNonnullFoo();
+Foo * _Nullable getNullableFoo();
+Foo * getMightBeNullFoo();
+
+void testCreateDictionaryLiteralWithNullableArg() {
+  (void)@{@"abc" : getMightBeNullFoo()}; // no warning
+  (void)@{@"abc" : getNonnullFoo()}; // no warning
+  (void)@{@"abc" : getNullableFoo()}; // expected-warning {{Nullable pointer 
is passed to a callee that requires a non-null}}
+}
+
+void testCreateArrayLiteralWithNullableArg() {
+  (void)@[getMightBeNullFoo()]; // no warning
+  (void)@[getNonnullFoo()]; // no warning
+  (void)@[getNullableFoo()]; // expected-warning {{Nullable pointer is passed 
to a callee that requires a non-null}}
+}
Index: clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
@@ -97,7 +97,8 @@
 namespace {
   class NilArgChecker : public Checker,
-   check::PostStmt > {
+   check::PostStmt,
+   
EventDispatcher> {
 mutable std::unique_ptr BT;
 
 mutable llvm::SmallDenseMap StringSelectors;
@@ -141,11 +142,31 @@
   CheckerContext ) const {
   ProgramStateRef State = C.getState();
   if (State->isNull(C.getSVal(E)).isConstrainedTrue()) {
-
 if (ExplodedNode *N = C.generateErrorNode()) {
   generateBugReport(N, Msg, E->getSourceRange(), E, C);
+  return;
 }
   }
+
+  auto ArgSVal = C.getSVal(E).getAs();
+  if (!ArgSVal)
+return;
+
+  ProgramStateRef StNonNull, StNull;
+  std::tie(StNonNull, StNull) = State->assume(*ArgSVal);
+
+  if (StNull) {
+if (ExplodedNode *N = C.generateSink(StNull, C.getPredecessor())) {
+  ImplicitNullDerefEvent event = {*ArgSVal, false, N, (),
+  /*IsDirectDereference=*/false};
+  dispatchEvent(event);
+}
+  }
+
+  if (StNonNull)
+State = StNonNull;
+
+  C.addTransition(State);
 }
 
 void NilArgChecker::warnIfNilArg(CheckerContext ,


Index: clang/test/Analysis/NSContainers.m
===
--- clang/test/Analysis/NSContainers.m
+++ clang/test/Analysis/NSContainers.m
@@ -1,4 +1,4 @@
-// RUN: %clang_analyze_cc1  -Wno-objc-literal-conversion -analyzer-checker=core,osx.cocoa.NonNilReturnValue,osx.cocoa.NilArg,osx.cocoa.Loops,debug.ExprInspection -verify -Wno-objc-root-class %s
+// RUN: %clang_analyze_cc1 -Wno-objc-literal-conversion -analyzer-checker=core,osx.cocoa.NonNilReturnValue,osx.cocoa.NilArg,osx.cocoa.Loops,debug.ExprInspection,nullability -verify -Wno-objc-root-class %s
 
 void clang_analyzer_eval(int);
 
@@ -323,3 +323,19 @@
   // that 'obj' can be nil in this context.
   dict[obj] = getStringFromString(obj); // no-warning
 }
+
+Foo * _Nonnull getNonnullFoo();
+Foo * _Nullable getNullableFoo();
+Foo * getMightBeNullFoo();
+
+void testCreateDictionaryLiteralWithNullableArg() {
+  (void)@{@"abc" : getMightBeNullFoo()}; // no warning
+  (void)@{@"abc" : getNonnullFoo()}; // no warning
+  (void)@{@"abc" : getNullableFoo()}; // expected-warning {{Nullable pointer is passed to a callee that requires a non-null}}
+}
+
+void testCreateArrayLiteralWithNullableArg() {
+  (void)@[getMightBeNullFoo()]; // no warning
+  (void)@[getNonnullFoo()]; // no warning
+  (void)@[getNullableFoo()]; // expected-warning {{Nullable pointer is passed to a callee that requires a non-null}}
+}
Index: clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
===
--- clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
+++ 

[PATCH] D139837: [Clang] Implements CTAD for aggregates P1816R0 and P2082R1

2023-06-06 Thread Yuanfang Chen via Phabricator via cfe-commits
ychen added a comment.

In D139837#4401134 , @cor3ntin wrote:

> I think this looks good but I'll let @aaron.ballman do the final approval.

Thanks for the review @cor3ntin.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139837/new/

https://reviews.llvm.org/D139837

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


[PATCH] D151528: [clang][DeclPrinter] Fix AST print of out-of-line record definitions

2023-06-06 Thread Timo Stripf via Phabricator via cfe-commits
strimo378 added a comment.

Please use "Timo Stripf" and timo.str...@emmtrix.com

Thank you for your review.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151528/new/

https://reviews.llvm.org/D151528

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


[PATCH] D144006: [DebugMetadata][DwarfDebug] Support function-local types in lexical block scopes (4/7)

2023-06-06 Thread Vladislav Dzhidzhoev via Phabricator via cfe-commits
dzhidzhoev updated this revision to Diff 529100.
dzhidzhoev added a comment.

Added AutoUpdater, moving function-local types belonging to DICompileUnit to a 
corresponding DISubprogram.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144006/new/

https://reviews.llvm.org/D144006

Files:
  clang/test/CodeGen/debug-info-codeview-unnamed.c
  clang/test/CodeGen/debug-info-unused-types.c
  clang/test/CodeGen/debug-info-unused-types.cpp
  clang/test/CodeGenCXX/debug-info-access.cpp
  clang/test/CodeGenCXX/debug-info-anon-union-vars.cpp
  clang/test/CodeGenCXX/debug-info-codeview-unnamed.cpp
  clang/test/CodeGenCXX/debug-info-gline-tables-only-codeview.cpp
  clang/test/CodeGenCXX/debug-lambda-this.cpp
  llvm/include/llvm/IR/DIBuilder.h
  llvm/lib/Bitcode/Reader/MetadataLoader.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
  llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
  llvm/lib/IR/DIBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/test/Bitcode/upgrade-cu-locals.ll
  llvm/test/Bitcode/upgrade-cu-locals.ll.bc
  llvm/test/DebugInfo/Generic/inlined-local-type.ll
  llvm/test/DebugInfo/Generic/lexical-block-retained-types.ll
  llvm/test/DebugInfo/Generic/lexical-block-types.ll
  llvm/test/DebugInfo/Generic/local-type-as-template-parameter.ll
  llvm/test/DebugInfo/Generic/verifier-invalid-disubprogram.ll
  llvm/test/DebugInfo/X86/set.ll

Index: llvm/test/DebugInfo/X86/set.ll
===
--- llvm/test/DebugInfo/X86/set.ll
+++ llvm/test/DebugInfo/X86/set.ll
@@ -68,11 +68,11 @@
 !llvm.module.flags = !{!18, !19, !20}
 
 !0 = !{!"versions- cm3: d5.10.0 llvm: 9.0"}
-!1 = distinct !DICompileUnit(language: DW_LANG_Modula3, file: !2, producer: "cm3", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !3)
+!1 = distinct !DICompileUnit(language: DW_LANG_Modula3, file: !2, producer: "cm3", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug)
 !2 = !DIFile(filename: "Main.m3", directory: "/home/cm3/settest/src")
 !3 = !{!4}
 !4 = !DICompositeType(tag: DW_TAG_enumeration_type, name: "Enum", scope: !5, file: !2, line: 11, size: 8, align: 8, elements: !9)
-!5 = distinct !DISubprogram(name: "Test", linkageName: "Main__Test", scope: !2, file: !2, line: 11, type: !6, scopeLine: 11, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !8)
+!5 = distinct !DISubprogram(name: "Test", linkageName: "Main__Test", scope: !2, file: !2, line: 11, type: !6, scopeLine: 11, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !3)
 !6 = !DISubroutineType(types: !7)
 !7 = !{null}
 !8 = !{}
Index: llvm/test/DebugInfo/Generic/verifier-invalid-disubprogram.ll
===
--- llvm/test/DebugInfo/Generic/verifier-invalid-disubprogram.ll
+++ llvm/test/DebugInfo/Generic/verifier-invalid-disubprogram.ll
@@ -38,7 +38,7 @@
 define void @invalid_retained_nodes_list() !dbg !10 { ret void }
 !10 = distinct !DISubprogram(retainedNodes: !0)
 
-; CHECK: invalid retained nodes, expected DILocalVariable, DILabel or DIImportedEntity
+; CHECK: invalid retained nodes, expected DILocalVariable, DILabel, DIImportedEntity or DIType
 define void @invalid_retained_nodes_expected() !dbg !11 { ret void }
 !11 = distinct !DISubprogram(retainedNodes: !{!0})
 
Index: llvm/test/DebugInfo/Generic/local-type-as-template-parameter.ll
===
--- /dev/null
+++ llvm/test/DebugInfo/Generic/local-type-as-template-parameter.ll
@@ -0,0 +1,160 @@
+; RUN: %llc_dwarf -O0 -filetype=obj < %s  \
+; RUN:  | llvm-dwarfdump --show-children --name=foo - \
+; RUN:  | FileCheck --implicit-check-not "{{DW_TAG|NULL}}" %s
+
+; The test ensures that AsmPrinter doesn't crashed compiling this.
+; It also demostrates misplacement for a local type (see PR55680 for details).
+
+; The test compiled from:
+
+; template
+; struct A {
+;   A(T ) : a(in) {}
+;   T a;
+; };
+;
+; __attribute__((always_inline))
+; void foo() {
+;   struct B { int i; };
+;   B objB;
+;   A objA(objB);
+; }
+;
+; int main() {
+;   foo();
+; }
+
+; Concrete out-of-line tree of foo().
+; CHECK: DW_TAG_subprogram
+; CHECK:   DW_AT_abstract_origin {{.*}} "_Z3foov"
+
+; FIXME: 'struct B' should be in the abstract tree below, not here.
+; CHECK:   DW_TAG_structure_type
+; CHECK: DW_AT_name	("B")
+; CHECK: DW_TAG_member
+; CHECK: NULL
+;
+; CHECK:   DW_TAG_variable
+; CHECK: DW_AT_abstract_origin {{.*}} "objB"
+; CHECK:   DW_TAG_variable
+; CHECK: DW_AT_abstract_origin {{.*}} "objA"
+
+; CHECK:   NULL
+
+; Abstract tree of foo().
+; CHECK: DW_TAG_subprogram
+; CHECK:   DW_AT_name	("foo")
+; CHECK:   DW_AT_inline	(DW_INL_inlined)
+
+; CHECK:   DW_TAG_variable
+; CHECK: DW_AT_name	("objB")
+; CHECK:   DW_TAG_variable
+; CHECK: DW_AT_name	("objA")
+
+; CHECK:   NULL
+
+; CHECK: DW_TAG_inlined_subroutine
+; 

[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Sam Clegg via Phabricator via cfe-commits
sbc100 added a comment.

In D150803#4401552 , @sunfish wrote:

> In D150803#4401204 , @sbc100 wrote:
>
>> In D150803#4401061 , @sunfish 
>> wrote:
>>
>>> wasm_jspi works for me.
>>
>> The problem with that is that we will also likely want to use this attribute 
>> for asyncify (which is the current async approach we have today) as well as 
>> JSPI (which is hopefully coming soon)
>
> Ah, I see. Would it be accurate to say that asyncify is acting as a kind of a 
> polyfill for JSPI in this situation, such that `wasm_jspi` is actually 
> correct?

Sure, that seems reasonable to see that way.   I'm ok with that name if others 
are.

> Alternatively, what would you think about `wasm_external_async`?




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D144004: [DebugMetadata][DwarfDebug] Fix DWARF emisson of function-local imported entities (3/7)

2023-06-06 Thread Vladislav Dzhidzhoev via Phabricator via cfe-commits
dzhidzhoev updated this revision to Diff 529098.
dzhidzhoev added a comment.

Added AutoUpdater, moving function-local imported entities belonging to 
DICompileUnit to a corresponding DISubprogram.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144004/new/

https://reviews.llvm.org/D144004

Files:
  clang/test/CodeGenCXX/debug-info-namespace.cpp
  llvm/include/llvm/IR/DIBuilder.h
  llvm/lib/Bitcode/Reader/MetadataLoader.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
  llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h
  llvm/lib/CodeGen/AsmPrinter/DwarfFile.h
  llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
  llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h
  llvm/lib/IR/DIBuilder.cpp
  llvm/lib/IR/Verifier.cpp
  llvm/lib/Linker/IRMover.cpp
  llvm/test/Bitcode/DIModule-fortran-external-module.ll
  llvm/test/Bitcode/upgrade-cu-locals.ll
  llvm/test/Bitcode/upgrade-cu-locals.ll.bc
  llvm/test/CodeGen/Generic/DbgValueAggregate.ll
  llvm/test/DebugInfo/Generic/import-inlined-declaration.ll
  llvm/test/DebugInfo/Generic/imported-name-inlined.ll
  llvm/test/DebugInfo/Generic/namespace.ll
  llvm/test/DebugInfo/Generic/split-dwarf-local-import.ll
  llvm/test/DebugInfo/Generic/split-dwarf-local-import2.ll
  llvm/test/DebugInfo/Generic/split-dwarf-local-import3.ll
  llvm/test/DebugInfo/Generic/verifier-invalid-disubprogram.ll
  llvm/test/DebugInfo/X86/dimodule-external-fortran.ll
  llvm/test/DebugInfo/X86/dwarfdump-DIImportedEntity_elements.ll
  llvm/test/DebugInfo/X86/fission-inline.ll
  llvm/test/DebugInfo/X86/fission-local-import.ll
  llvm/test/DebugInfo/X86/fission-no-inline-gsym.ll
  llvm/test/DebugInfo/X86/lexical-block-file-inline.ll
  llvm/test/DebugInfo/X86/namelist2.ll
  llvm/test/DebugInfo/omit-empty.ll
  llvm/test/Linker/pr26037.ll
  llvm/test/ThinLTO/X86/debuginfo-cu-import.ll

Index: llvm/test/ThinLTO/X86/debuginfo-cu-import.ll
===
--- llvm/test/ThinLTO/X86/debuginfo-cu-import.ll
+++ llvm/test/ThinLTO/X86/debuginfo-cu-import.ll
@@ -5,15 +5,13 @@
 ; RUN: opt -module-summary %p/Inputs/debuginfo-cu-import.ll -o %t2.bc
 ; RUN: llvm-lto -thinlto-action=thinlink -o %t.index.bc %t1.bc %t2.bc
 
-; Don't import enums, macros, retainedTypes or globals lists.
-; Only import local scope imported entities.
+; Don't import enums, macros, retainedTypes, globals or imports lists.
 ; RUN: llvm-lto -thinlto-action=import %t2.bc -thinlto-index=%t.index.bc -o - | llvm-dis -o - | FileCheck %s
 ; CHECK-NOT: DICompileUnit{{.*}} enums:
 ; CHECK-NOT: DICompileUnit{{.*}} macros:
 ; CHECK-NOT: DICompileUnit{{.*}} retainedTypes:
 ; CHECK-NOT: DICompileUnit{{.*}} globals:
-; CHECK: DICompileUnit{{.*}} imports: ![[IMP:[0-9]+]]
-; CHECK: ![[IMP]] = !{!{{[0-9]+}}}
+; CHECK-NOT: DICompileUnit{{.*}} imports:
 
 ; ModuleID = 'debuginfo-cu-import.c'
 source_filename = "debuginfo-cu-import.c"
@@ -50,14 +48,14 @@
 !8 = !{!9}
 !9 = !DIGlobalVariableExpression(var: !10, expr: !DIExpression())
 !10 = !DIGlobalVariable(name: "version", scope: !4, file: !1, line: 2, type: !7, isLocal: false, isDefinition: true)
-!11 = !{!12, !16}
+!11 = !{!12}
 !12 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !4, entity: !13, file: !1, line: 8)
 !13 = distinct !DISubprogram(name: "a", linkageName: "_ZN1A1aEv", scope: !4, file: !1, line: 7, type: !14, isLocal: false, isDefinition: true, scopeLine: 7, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !5)
 !14 = !DISubroutineType(types: !15)
 !15 = !{null}
 !16 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !17, entity: !19, file: !1, line: 8)
 !17 = distinct !DILexicalBlock(scope: !18, file: !1, line: 9, column: 8)
-!18 = distinct !DISubprogram(name: "c", linkageName: "_ZN1A1cEv", scope: !4, file: !1, line: 9, type: !14, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !5)
+!18 = distinct !DISubprogram(name: "c", linkageName: "_ZN1A1cEv", scope: !4, file: !1, line: 9, type: !14, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !33)
 !19 = distinct !DILexicalBlock(scope: !20, file: !1, line: 10, column: 8)
 !20 = distinct !DISubprogram(name: "d", linkageName: "_ZN1A1dEv", scope: !4, file: !1, line: 10, type: !14, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !5)
 !21 = !{!22}
@@ -72,4 +70,4 @@
 !30 = !DILocation(line: 7, column: 12, scope: !13)
 !31 = distinct !DISubprogram(name: "b", linkageName: "_ZN1A1bEv", scope: !4, file: !1, line: 8, type: !14, isLocal: true, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, retainedNodes: !5)
 !32 = !DILocation(line: 8, column: 24, scope: !31)
-
+!33 = !{!16}
Index: 

[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Dan Gohman via Phabricator via cfe-commits
sunfish added a comment.

In D150803#4401204 , @sbc100 wrote:

> In D150803#4401061 , @sunfish wrote:
>
>> wasm_jspi works for me.
>
> The problem with that is that we will also likely want to use this attribute 
> for asyncify (which is the current async approach we have today) as well as 
> JSPI (which is hopefully coming soon)

Ah, I see. Would it be accurate to say that asyncify is acting as a kind of a 
polyfill for JSPI in this situation, such that `wasm_jspi` is actually correct?

Alternatively, what would you think about `wasm_external_async`?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D143984: [DebugMetadata] Simplify handling subprogram's retainedNodes field. NFCI (1/7)

2023-06-06 Thread Vladislav Dzhidzhoev via Phabricator via cfe-commits
dzhidzhoev updated this revision to Diff 529096.
dzhidzhoev added a comment.

Rebased.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143984/new/

https://reviews.llvm.org/D143984

Files:
  clang/test/CodeGen/attr-btf_tag-disubprogram-callsite.c
  clang/test/CodeGenCXX/aix-static-init-debug-info.cpp
  clang/test/CodeGenCXX/debug-info-cxx1y.cpp
  clang/test/CodeGenCXX/debug-info-template.cpp
  clang/test/CodeGenObjC/debug-info-category.m
  llvm/include/llvm/IR/DIBuilder.h
  llvm/include/llvm/IR/DebugInfoMetadata.h
  llvm/lib/IR/DIBuilder.cpp

Index: llvm/lib/IR/DIBuilder.cpp
===
--- llvm/lib/IR/DIBuilder.cpp
+++ llvm/lib/IR/DIBuilder.cpp
@@ -52,23 +52,11 @@
 }
 
 void DIBuilder::finalizeSubprogram(DISubprogram *SP) {
-  MDTuple *Temp = SP->getRetainedNodes().get();
-  if (!Temp || !Temp->isTemporary())
-return;
-
-  SmallVector RetainedNodes;
-
-  auto PV = PreservedVariables.find(SP);
-  if (PV != PreservedVariables.end())
-RetainedNodes.append(PV->second.begin(), PV->second.end());
-
-  auto PL = PreservedLabels.find(SP);
-  if (PL != PreservedLabels.end())
-RetainedNodes.append(PL->second.begin(), PL->second.end());
-
-  DINodeArray Node = getOrCreateArray(RetainedNodes);
-
-  TempMDTuple(Temp)->replaceAllUsesWith(Node.get());
+  auto PN = SubprogramTrackedNodes.find(SP);
+  if (PN != SubprogramTrackedNodes.end())
+SP->replaceRetainedNodes(
+MDTuple::get(VMContext, SmallVector(PN->second.begin(),
+PN->second.end(;
 }
 
 void DIBuilder::finalize() {
@@ -766,26 +754,20 @@
 
 static DILocalVariable *createLocalVariable(
 LLVMContext ,
-DenseMap> ,
-DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
+SmallVectorImpl ,
+DIScope *Context, StringRef Name, unsigned ArgNo, DIFile *File,
 unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
 uint32_t AlignInBits, DINodeArray Annotations = nullptr) {
-  // FIXME: Why getNonCompileUnitScope()?
-  // FIXME: Why is "!Context" okay here?
   // FIXME: Why doesn't this check for a subprogram or lexical block (AFAICT
   // the only valid scopes)?
-  DIScope *Context = getNonCompileUnitScope(Scope);
-
-  auto *Node = DILocalVariable::get(
-  VMContext, cast_or_null(Context), Name, File, LineNo, Ty,
-  ArgNo, Flags, AlignInBits, Annotations);
+  auto *Scope = cast(Context);
+  auto *Node = DILocalVariable::get(VMContext, Scope, Name, File, LineNo, Ty,
+ArgNo, Flags, AlignInBits, Annotations);
   if (AlwaysPreserve) {
 // The optimizer may remove local variables. If there is an interest
 // to preserve variable info in such situation then stash it in a
 // named mdnode.
-DISubprogram *Fn = getDISubprogram(Scope);
-assert(Fn && "Missing subprogram for local variable");
-PreservedVariables[Fn].emplace_back(Node);
+PreservedNodes.emplace_back(Node);
   }
   return Node;
 }
@@ -795,9 +777,11 @@
DIType *Ty, bool AlwaysPreserve,
DINode::DIFlags Flags,
uint32_t AlignInBits) {
-  return createLocalVariable(VMContext, PreservedVariables, Scope, Name,
- /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve,
- Flags, AlignInBits);
+  assert(Scope && isa(Scope) &&
+ "Unexpected scope for a local variable.");
+  return createLocalVariable(
+  VMContext, getSubprogramNodesTrackingVector(Scope), Scope, Name,
+  /* ArgNo */ 0, File, LineNo, Ty, AlwaysPreserve, Flags, AlignInBits);
 }
 
 DILocalVariable *DIBuilder::createParameterVariable(
@@ -805,25 +789,23 @@
 unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
 DINodeArray Annotations) {
   assert(ArgNo && "Expected non-zero argument number for parameter");
-  return createLocalVariable(VMContext, PreservedVariables, Scope, Name, ArgNo,
- File, LineNo, Ty, AlwaysPreserve, Flags,
- /*AlignInBits=*/0, Annotations);
+  assert(Scope && isa(Scope) &&
+ "Unexpected scope for a local variable.");
+  return createLocalVariable(
+  VMContext, getSubprogramNodesTrackingVector(Scope), Scope, Name, ArgNo,
+  File, LineNo, Ty, AlwaysPreserve, Flags, /*AlignInBits=*/0, Annotations);
 }
 
-DILabel *DIBuilder::createLabel(DIScope *Scope, StringRef Name, DIFile *File,
-unsigned LineNo, bool AlwaysPreserve) {
-  DIScope *Context = getNonCompileUnitScope(Scope);
-
-  auto *Node = DILabel::get(VMContext, cast_or_null(Context),
-Name, File, LineNo);
+DILabel *DIBuilder::createLabel(DIScope *Context, StringRef Name, DIFile *File,
+ 

[PATCH] D148924: [clang] Show error if defaulted comparions operator function is volatile or has ref-qualifier &&.

2023-06-06 Thread Shafik Yaghmour via Phabricator via cfe-commits
shafik accepted this revision.
shafik added a comment.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148924/new/

https://reviews.llvm.org/D148924

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


[PATCH] D152321: [clang] Replace use of Type::getPointerTo() (NFC)

2023-06-06 Thread Youngsuk Kim via Phabricator via cfe-commits
JOE1994 created this revision.
JOE1994 added a reviewer: nikic.
Herald added a subscriber: StephenFan.
Herald added a project: All.
JOE1994 requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Partial progress towards replacing in-tree uses of `Type::getPointerTo()`.
This needs to be done before deprecating the API.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152321

Files:
  clang/lib/CodeGen/Address.h
  clang/lib/CodeGen/CGAtomic.cpp
  clang/lib/CodeGen/CGBlocks.cpp
  clang/lib/CodeGen/CGBuilder.h
  clang/lib/CodeGen/CGBuiltin.cpp
  clang/lib/CodeGen/CGCUDANV.cpp
  clang/lib/CodeGen/CGCXX.cpp
  clang/lib/CodeGen/CGCXXABI.cpp
  clang/lib/CodeGen/CGClass.cpp
  clang/lib/CodeGen/CGDecl.cpp
  clang/lib/CodeGen/CGDeclCXX.cpp
  clang/lib/CodeGen/CGException.cpp
  clang/lib/CodeGen/CGExprCXX.cpp
  clang/lib/CodeGen/CGExprConstant.cpp
  clang/lib/CodeGen/CGObjCRuntime.cpp
  clang/lib/CodeGen/CodeGenTypes.cpp
  clang/lib/CodeGen/ItaniumCXXABI.cpp
  clang/lib/CodeGen/TargetInfo.cpp

Index: clang/lib/CodeGen/TargetInfo.cpp
===
--- clang/lib/CodeGen/TargetInfo.cpp
+++ clang/lib/CodeGen/TargetInfo.cpp
@@ -402,7 +402,7 @@
   llvm::Type *DirectTy = CGF.ConvertTypeForMem(ValueTy), *ElementTy = DirectTy;
   if (IsIndirect) {
 unsigned AllocaAS = CGF.CGM.getDataLayout().getAllocaAddrSpace();
-DirectTy = DirectTy->getPointerTo(AllocaAS);
+DirectTy = llvm::PointerType::get(DirectTy, AllocaAS);
   }
 
   Address Addr = emitVoidPtrDirectVAArg(CGF, VAListAddr, DirectTy, DirectSize,
@@ -2042,7 +2042,7 @@
   Info = ABIArgInfo::getInAlloca(FrameFields.size(), IsIndirect);
   llvm::Type *LLTy = CGT.ConvertTypeForMem(Type);
   if (IsIndirect)
-LLTy = LLTy->getPointerTo(0);
+LLTy = llvm::PointerType::getUnqual(LLTy);
   FrameFields.push_back(LLTy);
   StackOffset += IsIndirect ? WordSize : getContext().getTypeSizeInChars(Type);
 
@@ -4851,7 +4851,7 @@
   Builder.CreateCondBr(CC, UsingRegs, UsingOverflow);
 
   llvm::Type *DirectTy = CGF.ConvertType(Ty), *ElementTy = DirectTy;
-  if (isIndirect) DirectTy = DirectTy->getPointerTo(0);
+  if (isIndirect) DirectTy = llvm::PointerType::getUnqual(DirectTy);
 
   // Case 1: consume registers.
   Address RegAddr = Address::invalid();
Index: clang/lib/CodeGen/ItaniumCXXABI.cpp
===
--- clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -687,7 +687,8 @@
   {VFPAddr, llvm::ConstantInt::get(CGM.Int32Ty, 0), TypeId});
   CheckResult = Builder.CreateExtractValue(CheckedLoad, 1);
   VirtualFn = Builder.CreateExtractValue(CheckedLoad, 0);
-  VirtualFn = Builder.CreateBitCast(VirtualFn, FTy->getPointerTo(),
+  VirtualFn = Builder.CreateBitCast(VirtualFn,
+llvm::PointerType::getUnqual(FTy),
 "memptr.virtualfn");
 } else {
   // When not doing VFE, emit a normal load, as it allows more
@@ -709,14 +710,14 @@
 CGM.getIntrinsic(llvm::Intrinsic::load_relative,
  {VTableOffset->getType()}),
 {VTable, VTableOffset});
-VirtualFn = CGF.Builder.CreateBitCast(VirtualFn, FTy->getPointerTo());
+VirtualFn = CGF.Builder.CreateBitCast(VirtualFn, llvm::PointerType::getUnqual(FTy));
   } else {
 llvm::Value *VFPAddr =
 CGF.Builder.CreateGEP(CGF.Int8Ty, VTable, VTableOffset);
 VFPAddr = CGF.Builder.CreateBitCast(
-VFPAddr, FTy->getPointerTo()->getPointerTo());
+VFPAddr, llvm::PointerType::getUnqual(llvm::PointerType::getUnqual(FTy)));
 VirtualFn = CGF.Builder.CreateAlignedLoad(
-FTy->getPointerTo(), VFPAddr, CGF.getPointerAlign(),
+llvm::PointerType::getUnqual(FTy), VFPAddr, CGF.getPointerAlign(),
 "memptr.virtualfn");
   }
 }
@@ -758,7 +759,7 @@
   // function pointer.
   CGF.EmitBlock(FnNonVirtual);
   llvm::Value *NonVirtualFn =
-Builder.CreateIntToPtr(FnAsInt, FTy->getPointerTo(), "memptr.nonvirtualfn");
+Builder.CreateIntToPtr(FnAsInt, llvm::PointerType::getUnqual(FTy), "memptr.nonvirtualfn");
 
   // Check the function pointer if CFI on member function pointers is enabled.
   if (ShouldEmitCFICheck) {
@@ -799,7 +800,7 @@
 
   // We're done.
   CGF.EmitBlock(FnEnd);
-  llvm::PHINode *CalleePtr = Builder.CreatePHI(FTy->getPointerTo(), 2);
+  llvm::PHINode *CalleePtr = Builder.CreatePHI(llvm::PointerType::getUnqual(FTy), 2);
   CalleePtr->addIncoming(VirtualFn, FnVirtual);
   CalleePtr->addIncoming(NonVirtualFn, FnNonVirtual);
 
@@ -825,8 +826,8 @@
 
   // Cast the address to the appropriate pointer type, adopting the
   // address space of the base pointer.
-  llvm::Type *PType = CGF.ConvertTypeForMem(MPT->getPointeeType())
-

[PATCH] D152017: [DebugInfo] Add flag to only emit referenced member functions

2023-06-06 Thread Reid Kleckner via Phabricator via cfe-commits
rnk added a comment.

In D152017#4401075 , @dblaikie wrote:

> Yeah, mixed feelings about a default-on flag, so you have to use `-gno-*`. 
> Though one name in that form, might be `-gno-canonical-types`.
> (pedantically C++ calls these things "member functions" (& it seems nice to 
> use consistent naming) rather than "methods", but 
> `-g[no-]undefined-member-functions` would be a bit of a mouthful... )

We don't have great project-wide policy in Clang about whether to use 
colloquial terminology or standardese in user visible text. Some diagnostics go 
to great lengths to use the WG21 terminology, and others less so. Our AST node 
is a `CXXMethodDecl`, so I'd vote for using "methods" over "member functions".


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152017/new/

https://reviews.llvm.org/D152017

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


[PATCH] D148700: [clang] Add support for “regular” keyword attributes

2023-06-06 Thread Richard Smith - zygoloid via Phabricator via cfe-commits
rsmith added a comment.

In D148700#4401353 , @jyknight wrote:

> Yes, standard attributes aren't supposed to be used for things which affect 
> the type system (although, we certainly have many, already, which do, since 
> we expose most GCC-syntax attributes also as C++-standard attribute syntax!)

The rule that standard attributes don't affect semantics only applies to 
attributes specified by the language standard. There is no expectation that 
vendor attributes avoid such effects. In particular, I'm concerned by this in 
the description of this change:

In D148700 , @rsandifo-arm wrote:

> Really, the “only” thing wrong with using standard attributes is that 
> standard attributes cannot affect semantics.

If the only reason for this patch series is an idea that vendor attributes 
using `[[...]]` syntax can't affect program semantics, then I think this change 
is not justified, because vendor attributes using `[[...]]` syntax can and 
usually do affect program semantics. But the documentation change here makes 
the point that using a keyword attribute may be as good idea in cases where you 
would always want compilation to fail on a compiler that doesn't understand the 
annotation, rather than the annotation being ignored (likely with a warning), 
so maybe that's reasonable justification for this direction.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148700/new/

https://reviews.llvm.org/D148700

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


[PATCH] D152318: [Fuchsia] Add llvm-strings to Fuchsia clang build

2023-06-06 Thread Haowei Wu via Phabricator via cfe-commits
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGbb398898dad9: [Fuchsia] Add llvm-strings to Fuchsia clang 
build. (authored by haowei).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152318/new/

https://reviews.llvm.org/D152318

Files:
  clang/cmake/caches/Fuchsia-stage2.cmake


Index: clang/cmake/caches/Fuchsia-stage2.cmake
===
--- clang/cmake/caches/Fuchsia-stage2.cmake
+++ clang/cmake/caches/Fuchsia-stage2.cmake
@@ -321,6 +321,7 @@
   llvm-readelf
   llvm-readobj
   llvm-size
+  llvm-strings
   llvm-strip
   llvm-symbolizer
   llvm-undname


Index: clang/cmake/caches/Fuchsia-stage2.cmake
===
--- clang/cmake/caches/Fuchsia-stage2.cmake
+++ clang/cmake/caches/Fuchsia-stage2.cmake
@@ -321,6 +321,7 @@
   llvm-readelf
   llvm-readobj
   llvm-size
+  llvm-strings
   llvm-strip
   llvm-symbolizer
   llvm-undname
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] bb39889 - [Fuchsia] Add llvm-strings to Fuchsia clang build.

2023-06-06 Thread Haowei Wu via cfe-commits

Author: Haowei Wu
Date: 2023-06-06T16:27:35-07:00
New Revision: bb398898dad98e001f8b665a37ab6fb8cef70814

URL: 
https://github.com/llvm/llvm-project/commit/bb398898dad98e001f8b665a37ab6fb8cef70814
DIFF: 
https://github.com/llvm/llvm-project/commit/bb398898dad98e001f8b665a37ab6fb8cef70814.diff

LOG: [Fuchsia] Add llvm-strings to Fuchsia clang build.

This patch adds 'llvm-strings' to Fuchsia clang build.

Differential Revision: https://reviews.llvm.org/D152318

Added: 


Modified: 
clang/cmake/caches/Fuchsia-stage2.cmake

Removed: 




diff  --git a/clang/cmake/caches/Fuchsia-stage2.cmake 
b/clang/cmake/caches/Fuchsia-stage2.cmake
index b4bc8cb4eb64e..9bacd27d31eaa 100644
--- a/clang/cmake/caches/Fuchsia-stage2.cmake
+++ b/clang/cmake/caches/Fuchsia-stage2.cmake
@@ -321,6 +321,7 @@ set(LLVM_TOOLCHAIN_TOOLS
   llvm-readelf
   llvm-readobj
   llvm-size
+  llvm-strings
   llvm-strip
   llvm-symbolizer
   llvm-undname



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


[PATCH] D152318: [Fuchsia] Add llvm-strings to Fuchsia clang build

2023-06-06 Thread Petr Hosek via Phabricator via cfe-commits
phosek accepted this revision.
phosek added a comment.
This revision is now accepted and ready to land.

LGTM


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152318/new/

https://reviews.llvm.org/D152318

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


[PATCH] D152318: [Fuchsia] Add llvm-strings to Fuchsia clang build

2023-06-06 Thread Haowei Wu via Phabricator via cfe-commits
haowei created this revision.
haowei added reviewers: phosek, mcgrathr.
Herald added subscribers: abrachet, mstorsjo.
Herald added a project: All.
haowei requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

This patch adds 'llvm-strings' to Fuchsia clang build.

This tool is required to build a llvm based MinGW.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152318

Files:
  clang/cmake/caches/Fuchsia-stage2.cmake


Index: clang/cmake/caches/Fuchsia-stage2.cmake
===
--- clang/cmake/caches/Fuchsia-stage2.cmake
+++ clang/cmake/caches/Fuchsia-stage2.cmake
@@ -321,6 +321,7 @@
   llvm-readelf
   llvm-readobj
   llvm-size
+  llvm-strings
   llvm-strip
   llvm-symbolizer
   llvm-undname


Index: clang/cmake/caches/Fuchsia-stage2.cmake
===
--- clang/cmake/caches/Fuchsia-stage2.cmake
+++ clang/cmake/caches/Fuchsia-stage2.cmake
@@ -321,6 +321,7 @@
   llvm-readelf
   llvm-readobj
   llvm-size
+  llvm-strings
   llvm-strip
   llvm-symbolizer
   llvm-undname
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151863: [x86][MC] Fix movdir64b addressing

2023-06-06 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added inline comments.



Comment at: llvm/test/CodeGen/X86/movdir64b-inline-asm-x86_64.ll:1
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 
UTC_ARGS: --version 2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+movdir64b | FileCheck 
%s --check-prefix=X64

akshaykhadse wrote:
> MaskRay wrote:
> > I think we should reuse an existing `*-inline-asm-*` test file.
> > 
> > See 
> > https://maskray.me/blog/2021-08-08-toolchain-testing#the-test-checks-at-the-wrong-layer
> >  "I don't know an existing test can be enhanced"
> **I could not find an appropriate existing test.**
> I added a couple of cases in the CFE tests 
> `clang/test/CodeGen/ms-inline-asm-64.c` and 
> `clang/test/CodeGen/ms-inline-asm.c`.
> Now, when I had to add backend tests, I searched for an appropriate file:
> ```
> llvm-project$ find llvm/test/CodeGen/X86 -type f -name ms-inline-asm-*
> llvm/test/CodeGen/X86/ms-inline-asm-variables-x86-2-regs.ll
> llvm/test/CodeGen/X86/ms-inline-asm-array.ll
> llvm/test/CodeGen/X86/ms-inline-asm-PR44272.ll
> llvm/test/CodeGen/X86/ms-inline-asm-variables-x64-2-regs.ll
> llvm/test/CodeGen/X86/ms-inline-asm-functions.ll
> llvm/test/CodeGen/X86/ms-inline-asm-redundant-clobber.ll
> llvm/test/CodeGen/X86/ms-inline-asm-variables-x64-1-reg.ll
> llvm/test/CodeGen/X86/ms-inline-asm-variables-x86-1-reg.ll
> llvm/test/CodeGen/X86/ms-inline-asm-avx512.ll
> llvm/test/CodeGen/X86/ms-inline-asm-variables-x64-nopic.ll
> ```
> As you can see, there are tests for variables, functions, arrays, but no 
> general tests like `ms-inline-asm.ll`.
> My general observation is that for a CFE test `*-inline-asm*.c` there's an 
> equivalent test in LLVM backend which mentions the original test name in the 
> comment. For example, `ms-inline-asm-variables-x86-2-regs.ll` mentions that 
> `Tests come from "clang/test/CodeGen/ms-inline-asm-variables.c"`.
> However, there is no such file which mentions either `ms-inline-asm.c` or 
> `ms-inline-asm-64.c`
> So, I picked up an assembly instruction `xgetbv` from `ms-inline-asm.c` and 
> searched it in the available `.ll` backend test via `llvm-project$ find 
> llvm/test -type f -name *.ll -exec grep -l "xgetbv" {} \;`. There was just 
> one file `llvm/test/CodeGen/X86/system-intrinsics-xgetbv.ll` that contains 
> test for just this one instruction.
> **Please suggest an appropriate 32-bit and 64-bit file to add this test**
Thanks for the investigation. Sometimes we can consider refactoring existing 
tests before adding a new test. 

Even if we add a new file, `inline-asm-*.ll` may be a better name than 
`*-inline-asm.ll`, since the former allows code completion to find related 
tests more easily.

I'll run away:) My comment is to prompt investigation but I don't plan to look 
at the problem closely.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151863/new/

https://reviews.llvm.org/D151863

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


[PATCH] D142823: Intrinsics: Allow tablegen to mark parameters with dereferenceable

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm updated this revision to Diff 529074.
arsenm added a comment.

Split out amdgpu parts


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142823/new/

https://reviews.llvm.org/D142823

Files:
  llvm/include/llvm/IR/Intrinsics.td
  llvm/test/TableGen/intrin-side-effects.td
  llvm/test/TableGen/intrinsic-attrs.td
  llvm/utils/TableGen/CodeGenIntrinsics.cpp
  llvm/utils/TableGen/CodeGenIntrinsics.h
  llvm/utils/TableGen/IntrinsicEmitter.cpp

Index: llvm/utils/TableGen/IntrinsicEmitter.cpp
===
--- llvm/utils/TableGen/IntrinsicEmitter.cpp
+++ llvm/utils/TableGen/IntrinsicEmitter.cpp
@@ -474,6 +474,10 @@
   OS << "  Attribute::get(C, Attribute::Alignment, "
  << Attr.Value << "),\n";
   break;
+case CodeGenIntrinsic::Dereferenceable:
+  OS << "  Attribute::get(C, Attribute::Dereferenceable, "
+ << Attr.Value << "),\n";
+  break;
 }
   }
   OS << "});\n";
Index: llvm/utils/TableGen/CodeGenIntrinsics.h
===
--- llvm/utils/TableGen/CodeGenIntrinsics.h
+++ llvm/utils/TableGen/CodeGenIntrinsics.h
@@ -113,7 +113,8 @@
 WriteOnly,
 ReadNone,
 ImmArg,
-Alignment
+Alignment,
+Dereferenceable
   };
 
   struct ArgAttribute {
Index: llvm/utils/TableGen/CodeGenIntrinsics.cpp
===
--- llvm/utils/TableGen/CodeGenIntrinsics.cpp
+++ llvm/utils/TableGen/CodeGenIntrinsics.cpp
@@ -234,6 +234,10 @@
 unsigned ArgNo = R->getValueAsInt("ArgNo");
 uint64_t Align = R->getValueAsInt("Align");
 addArgAttribute(ArgNo, Alignment, Align);
+  } else if (R->isSubClassOf("Dereferenceable")) {
+unsigned ArgNo = R->getValueAsInt("ArgNo");
+uint64_t Bytes = R->getValueAsInt("Bytes");
+addArgAttribute(ArgNo, Dereferenceable, Bytes);
   } else
 llvm_unreachable("Unknown property!");
 }
Index: llvm/test/TableGen/intrinsic-attrs.td
===
--- llvm/test/TableGen/intrinsic-attrs.td
+++ llvm/test/TableGen/intrinsic-attrs.td
@@ -9,7 +9,16 @@
   int isAny = 0;
 }
 
-def llvm_i32_ty: LLVMType;
+def llvm_i32_ty : LLVMType;
+def llvm_ptr_ty : LLVMType;
+
+class AttrIndex {
+  int Value = idx;
+}
+
+def FuncIndex : AttrIndex<-1>;
+def RetIndex : AttrIndex<0>;
+class ArgIndex : AttrIndex;
 
 class IntrinsicProperty {
   bit IsDefault = is_default;
@@ -17,6 +26,10 @@
 
 def IntrNoMem : IntrinsicProperty;
 def IntrHasSideEffects : IntrinsicProperty;
+class Dereferenceable : IntrinsicProperty {
+  int ArgNo = idx.Value;
+  int Bytes = bytes;
+}
 
 class Intrinsic ret_types,
 list param_types = [],
@@ -40,12 +53,33 @@
 // ... this intrinsic.
 def int_random_gen   : Intrinsic<[llvm_i32_ty], [], [IntrNoMem, IntrHasSideEffects]>;
 
+def int_deref_ptr_ret : Intrinsic<[llvm_ptr_ty], [], [Dereferenceable]>;
+
+// CHECK: static AttributeSet getIntrinsicArgAttributeSet(LLVMContext , unsigned ID) {
+// CHECK-NEXT:   switch (ID) {
+// CHECK-NEXT: default: llvm_unreachable("Invalid attribute set number");
+// CHECK-NEXT: case 0:
+// CHECK-NEXT: return AttributeSet::get(C, {
+// CHECK-NEXT: Attribute::get(C, Attribute::Dereferenceable, 16),
+// CHECK-NEXT: });
+// CHECK-NEXT: }
+// CHECK-NEXT: }
+
 // CHECK: static AttributeSet getIntrinsicFnAttributeSet(
 // CHECK: case 0:
 // CHECK-NEXT: return AttributeSet::get(C, {
 // CHECK-NEXT: Attribute::get(C, Attribute::NoUnwind),
 // CHECK-NEXT: });
 
-// CHECK: 1, // llvm.random.gen
+
+// CHECK: 1, // llvm.deref.ptr.ret
+// CHECK: 2, // llvm.random.gen
+
 // CHECK: case 1:
-// CHECK-NEXT: AS[0] = {AttributeList::FunctionIndex, getIntrinsicFnAttributeSet(C, 0)};
+// CHECK-NEXT: AS[0] = {0, getIntrinsicArgAttributeSet(C, 0)};
+// CHECK-NEXT: AS[1] = {AttributeList::FunctionIndex, getIntrinsicFnAttributeSet(C, 0)};
+// CHECK-NEXT: NumAttrs = 2;
+
+// CHECK: case 2:
+// CHECK-NEXT: AS[0] = {AttributeList::FunctionIndex, getIntrinsicFnAttributeSet(C, 1)};
+// CHECK-NEXT: NumAttrs = 1;
Index: llvm/include/llvm/IR/Intrinsics.td
===
--- llvm/include/llvm/IR/Intrinsics.td
+++ llvm/include/llvm/IR/Intrinsics.td
@@ -94,6 +94,11 @@
   int Align = align;
 }
 
+class Dereferenceable : IntrinsicProperty {
+  int ArgNo = idx.Value;
+  int Bytes = bytes;
+}
+
 // Returned - The specified argument is always the return value of the
 // intrinsic.
 class Returned : IntrinsicProperty {
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D148700: [clang] Add support for “regular” keyword attributes

2023-06-06 Thread James Y Knight via Phabricator via cfe-commits
jyknight added a comment.

> This makes ``CXX11`` and ``C2x`` spellings
> unsuitable for attributes that affect the type system, that change the
> binary interface of the code, or that have other similar semantic meaning.

Yes, standard attributes aren't supposed to be used for things which affect the 
type system (although, we certainly have many, already, which do, since we 
expose most GCC-syntax attributes also as C++-standard attribute syntax!)

But I think the C++ standard `[[no_unique_address]]` attribute is ample 
precedent that standard-attributes may validly affect ABI. 
`[[no_unique_address]]` may indeed be ignored without changing the validity of 
a program -- but it does change the ABI. So, if you care for ABI compatibility 
between compilers, all the compilers you're using need to agree on whether they 
ignore it or not.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148700/new/

https://reviews.llvm.org/D148700

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


[PATCH] D152285: Add support for the NO_COLOR environment variable

2023-06-06 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added a comment.

Thanks for the detailed description. I am generally conservative when it comes 
to new use cases for environment variables. However, `NO_COLOR` seems to become 
a standard and a large number of tools respect it, I think it is the right call 
to support it.

If we don't intend to support both standards, we can close 
https://github.com/llvm/llvm-project/issues/23983 (CLICOLOR) as a wontfix :)




Comment at: clang/lib/Frontend/CompilerInvocation.cpp:2346
+  bool ShowColors = true;
+  if (std::optional NoColor =
+  llvm::sys::Process::GetEnv("NO_COLOR")) {

We should inspect that `NO_COLOR` is not empty.

> Command-line software which adds ANSI color to its output by default should 
> check for a NO_COLOR environment variable that, when **present and not an 
> empty string** (regardless of its value), prevents the addition of ANSI color.



Comment at: clang/test/Driver/no-color.c:7
+
+// Note, the value of the environment variable does not matter, only that it 
is defined.
+// RUN: env NO_COLOR=0 %clang -### %s 2>&1 | FileCheck --check-prefix=NO-COLOR 
%s

when present and not an empty string, the value does not matter.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152285/new/

https://reviews.llvm.org/D152285

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


[PATCH] D152207: [HIP] Instruct lld to go through all archives

2023-06-06 Thread Siu Chi Chan via Phabricator via cfe-commits
scchan updated this revision to Diff 529061.
scchan added a comment.

remove ws


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152207/new/

https://reviews.llvm.org/D152207

Files:
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/test/Driver/hip-toolchain-rdc-separate.hip
  clang/test/Driver/hip-toolchain-rdc-static-lib.hip


Index: clang/test/Driver/hip-toolchain-rdc-static-lib.hip
===
--- clang/test/Driver/hip-toolchain-rdc-static-lib.hip
+++ clang/test/Driver/hip-toolchain-rdc-static-lib.hip
@@ -80,6 +80,7 @@
 // CHECK-NOT: ".*llc"
 // CHECK: [[LLD]] {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // CHECK-SAME: "-plugin-opt=mcpu=gfx900"
+// CHECK-SAME: "--whole-archive"
 // CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[A_BC2]] [[B_BC2]]
 
 // combine images generated into hip fat binary object
Index: clang/test/Driver/hip-toolchain-rdc-separate.hip
===
--- clang/test/Driver/hip-toolchain-rdc-separate.hip
+++ clang/test/Driver/hip-toolchain-rdc-separate.hip
@@ -126,6 +126,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx803"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV1:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx803]]"
 // LINK-SAME "[[A_BC1]]" "[[B_BC1]]"
@@ -135,6 +136,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx900"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV2:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx900]]"
 // LINK-SAME "[[A_BC2]]" "[[B_BC2]]"
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -152,6 +152,18 @@
 
   addLinkerCompressDebugSectionsOption(TC, Args, LldArgs);
 
+  // Given that host and device linking happen in separate processes, the 
device
+  // linker doesn't always have the visibility as to which device symbols are
+  // needed by a program, especially for the device symbol dependencies that 
are
+  // introduced through the host symbol resolution.
+  // For example: host_A() (A.obj) --> host_B(B.obj) --> device_kernel_B() 
(B.obj)
+  // In this case, the device linker doesn't know that A.obj actually depends 
on 
+  // the kernel functions in B.obj.  When linking to static device library, 
the 
+  // device linker may drop some of the device global symbols if they aren't
+  // referenced.  As a workaround, we are adding to the --whole-archive flag 
such
+  // that all global symbols would be linked in.
+  LldArgs.push_back("--whole-archive");
+
   for (auto *Arg : Args.filtered(options::OPT_Xoffload_linker)) {
 LldArgs.push_back(Arg->getValue(1));
 Arg->claim();


Index: clang/test/Driver/hip-toolchain-rdc-static-lib.hip
===
--- clang/test/Driver/hip-toolchain-rdc-static-lib.hip
+++ clang/test/Driver/hip-toolchain-rdc-static-lib.hip
@@ -80,6 +80,7 @@
 // CHECK-NOT: ".*llc"
 // CHECK: [[LLD]] {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // CHECK-SAME: "-plugin-opt=mcpu=gfx900"
+// CHECK-SAME: "--whole-archive"
 // CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[A_BC2]] [[B_BC2]]
 
 // combine images generated into hip fat binary object
Index: clang/test/Driver/hip-toolchain-rdc-separate.hip
===
--- clang/test/Driver/hip-toolchain-rdc-separate.hip
+++ clang/test/Driver/hip-toolchain-rdc-separate.hip
@@ -126,6 +126,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx803"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV1:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx803]]"
 // LINK-SAME "[[A_BC1]]" "[[B_BC1]]"
@@ -135,6 +136,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx900"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV2:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx900]]"
 // LINK-SAME "[[A_BC2]]" "[[B_BC2]]"
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -152,6 +152,18 @@
 
   addLinkerCompressDebugSectionsOption(TC, Args, LldArgs);
 
+  // Given that host and device linking happen in separate processes, the device
+  // linker doesn't always have the visibility as to which device symbols are
+  // needed by a program, especially for the device symbol dependencies that are
+  // introduced through the 

[PATCH] D152207: [HIP] Instruct lld to go through all archives

2023-06-06 Thread Siu Chi Chan via Phabricator via cfe-commits
scchan updated this revision to Diff 529060.
scchan added a comment.

Updated patch to address review feedback


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152207/new/

https://reviews.llvm.org/D152207

Files:
  clang/lib/Driver/ToolChains/HIPAMD.cpp
  clang/test/Driver/hip-toolchain-rdc-separate.hip
  clang/test/Driver/hip-toolchain-rdc-static-lib.hip


Index: clang/test/Driver/hip-toolchain-rdc-static-lib.hip
===
--- clang/test/Driver/hip-toolchain-rdc-static-lib.hip
+++ clang/test/Driver/hip-toolchain-rdc-static-lib.hip
@@ -80,6 +80,7 @@
 // CHECK-NOT: ".*llc"
 // CHECK: [[LLD]] {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // CHECK-SAME: "-plugin-opt=mcpu=gfx900"
+// CHECK-SAME: "--whole-archive"
 // CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[A_BC2]] [[B_BC2]]
 
 // combine images generated into hip fat binary object
Index: clang/test/Driver/hip-toolchain-rdc-separate.hip
===
--- clang/test/Driver/hip-toolchain-rdc-separate.hip
+++ clang/test/Driver/hip-toolchain-rdc-separate.hip
@@ -126,6 +126,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx803"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV1:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx803]]"
 // LINK-SAME "[[A_BC1]]" "[[B_BC1]]"
@@ -135,10 +136,12 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx900"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV2:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx900]]"
 // LINK-SAME "[[A_BC2]]" "[[B_BC2]]"
 
+
 // LINK-BUNDLE: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
 // LINK-BUNDLE-SAME: 
"-targets={{.*}},hipv4-amdgcn-amd-amdhsa--gfx803,hipv4-amdgcn-amd-amdhsa--gfx900"
 // LINK-BUNDLE-SAME: "-input={{.*}}" "-input=[[IMG_DEV1]]" 
"-input=[[IMG_DEV2]]" "-output=[[BUNDLE:.*]]"
Index: clang/lib/Driver/ToolChains/HIPAMD.cpp
===
--- clang/lib/Driver/ToolChains/HIPAMD.cpp
+++ clang/lib/Driver/ToolChains/HIPAMD.cpp
@@ -152,6 +152,18 @@
 
   addLinkerCompressDebugSectionsOption(TC, Args, LldArgs);
 
+  // Given that host and device linking happen in separate processes, the 
device
+  // linker doesn't always have the visibility as to which device symbols are
+  // needed by a program, especially for the device symbol dependencies that 
are
+  // introduced through the host symbol resolution.
+  // For example: host_A() (A.obj) --> host_B(B.obj) --> device_kernel_B() 
(B.obj)
+  // In this case, the device linker doesn't know that A.obj actually depends 
on 
+  // the kernel functions in B.obj.  When linking to static device library, 
the 
+  // device linker may drop some of the device global symbols if they aren't
+  // referenced.  As a workaround, we are adding to the --whole-archive flag 
such
+  // that all global symbols would be linked in.
+  LldArgs.push_back("--whole-archive");
+
   for (auto *Arg : Args.filtered(options::OPT_Xoffload_linker)) {
 LldArgs.push_back(Arg->getValue(1));
 Arg->claim();


Index: clang/test/Driver/hip-toolchain-rdc-static-lib.hip
===
--- clang/test/Driver/hip-toolchain-rdc-static-lib.hip
+++ clang/test/Driver/hip-toolchain-rdc-static-lib.hip
@@ -80,6 +80,7 @@
 // CHECK-NOT: ".*llc"
 // CHECK: [[LLD]] {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // CHECK-SAME: "-plugin-opt=mcpu=gfx900"
+// CHECK-SAME: "--whole-archive"
 // CHECK-SAME: "-o" "[[IMG_DEV2:.*out]]" [[A_BC2]] [[B_BC2]]
 
 // combine images generated into hip fat binary object
Index: clang/test/Driver/hip-toolchain-rdc-separate.hip
===
--- clang/test/Driver/hip-toolchain-rdc-separate.hip
+++ clang/test/Driver/hip-toolchain-rdc-separate.hip
@@ -126,6 +126,7 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx803"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV1:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx803]]"
 // LINK-SAME "[[A_BC1]]" "[[B_BC1]]"
@@ -135,10 +136,12 @@
 // LINK-NOT: ".*llc"
 // LINK: {{".*lld.*"}} {{.*}} "-plugin-opt=-amdgpu-internalize-symbols"
 // LINK-SAME: "-plugin-opt=mcpu=gfx900"
+// LINK-SAME: "--whole-archive"
 // LLD-TMP-SAME: "-o" "[[IMG_DEV2:.*.out]]"
 // LLD-FIN-SAME: "-o" "[[IMG_DEV1:a.out-.*gfx900]]"
 // LINK-SAME "[[A_BC2]]" "[[B_BC2]]"
 
+
 // LINK-BUNDLE: [[BUNDLER:".*clang-offload-bundler"]] "-type=o"
 // LINK-BUNDLE-SAME: "-targets={{.*}},hipv4-amdgcn-amd-amdhsa--gfx803,hipv4-amdgcn-amd-amdhsa--gfx900"
 // LINK-BUNDLE-SAME: "-input={{.*}}" "-input=[[IMG_DEV1]]" 

[PATCH] D152312: HIP: Use frexp builtins in math headers

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm created this revision.
arsenm added reviewers: yaxunl, JonChesterfield.
Herald added a project: All.
arsenm requested review of this revision.
Herald added a subscriber: wdng.

https://reviews.llvm.org/D152312

Files:
  clang/lib/Headers/__clang_hip_math.h
  clang/test/Headers/__clang_hip_math.hip


Index: clang/test/Headers/__clang_hip_math.hip
===
--- clang/test/Headers/__clang_hip_math.hip
+++ clang/test/Headers/__clang_hip_math.hip
@@ -1061,37 +1061,25 @@
   return fmod(x, y);
 }
 
-// DEFAULT-LABEL: @test_frexpf(
-// DEFAULT-NEXT:  entry:
-// DEFAULT-NEXT:[[TMP0:%.*]] = tail call i32 
@llvm.amdgcn.frexp.exp.i32.f32(float [[X:%.*]])
-// DEFAULT-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa 
[[TBAA11:![0-9]+]]
-// DEFAULT-NEXT:[[TMP1:%.*]] = tail call contract float 
@llvm.amdgcn.frexp.mant.f32(float [[X]])
-// DEFAULT-NEXT:ret float [[TMP1]]
-//
-// FINITEONLY-LABEL: @test_frexpf(
-// FINITEONLY-NEXT:  entry:
-// FINITEONLY-NEXT:[[TMP0:%.*]] = tail call i32 
@llvm.amdgcn.frexp.exp.i32.f32(float [[X:%.*]])
-// FINITEONLY-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa 
[[TBAA11:![0-9]+]]
-// FINITEONLY-NEXT:[[TMP1:%.*]] = tail call nnan ninf contract float 
@llvm.amdgcn.frexp.mant.f32(float [[X]])
-// FINITEONLY-NEXT:ret float [[TMP1]]
+// CHECK-LABEL: @test_frexpf(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = tail call { float, i32 } 
@llvm.frexp.f32.i32(float [[X:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 } [[TMP0]], 1
+// CHECK-NEXT:store i32 [[TMP1]], ptr [[Y:%.*]], align 4, !tbaa 
[[TBAA11:![0-9]+]]
+// CHECK-NEXT:[[TMP2:%.*]] = extractvalue { float, i32 } [[TMP0]], 0
+// CHECK-NEXT:ret float [[TMP2]]
 //
 extern "C" __device__ float test_frexpf(float x, int* y) {
   return frexpf(x, y);
 }
 
-// DEFAULT-LABEL: @test_frexp(
-// DEFAULT-NEXT:  entry:
-// DEFAULT-NEXT:[[TMP0:%.*]] = tail call i32 
@llvm.amdgcn.frexp.exp.i32.f64(double [[X:%.*]])
-// DEFAULT-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa 
[[TBAA11]]
-// DEFAULT-NEXT:[[TMP1:%.*]] = tail call contract double 
@llvm.amdgcn.frexp.mant.f64(double [[X]])
-// DEFAULT-NEXT:ret double [[TMP1]]
-//
-// FINITEONLY-LABEL: @test_frexp(
-// FINITEONLY-NEXT:  entry:
-// FINITEONLY-NEXT:[[TMP0:%.*]] = tail call i32 
@llvm.amdgcn.frexp.exp.i32.f64(double [[X:%.*]])
-// FINITEONLY-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa 
[[TBAA11]]
-// FINITEONLY-NEXT:[[TMP1:%.*]] = tail call nnan ninf contract double 
@llvm.amdgcn.frexp.mant.f64(double [[X]])
-// FINITEONLY-NEXT:ret double [[TMP1]]
+// CHECK-LABEL: @test_frexp(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:[[TMP0:%.*]] = tail call { double, i32 } 
@llvm.frexp.f64.i32(double [[X:%.*]])
+// CHECK-NEXT:[[TMP1:%.*]] = extractvalue { double, i32 } [[TMP0]], 1
+// CHECK-NEXT:store i32 [[TMP1]], ptr [[Y:%.*]], align 4, !tbaa [[TBAA11]]
+// CHECK-NEXT:[[TMP2:%.*]] = extractvalue { double, i32 } [[TMP0]], 0
+// CHECK-NEXT:ret double [[TMP2]]
 //
 extern "C" __device__ double test_frexp(double x, int* y) {
   return frexp(x, y);
Index: clang/lib/Headers/__clang_hip_math.h
===
--- clang/lib/Headers/__clang_hip_math.h
+++ clang/lib/Headers/__clang_hip_math.h
@@ -257,8 +257,7 @@
 
 __DEVICE__
 float frexpf(float __x, int *__nptr) {
-  *__nptr = __builtin_amdgcn_frexp_expf(__x);
-  return __builtin_amdgcn_frexp_mantf(__x);
+  return __builtin_frexpf(__x, __nptr);
 }
 
 __DEVICE__
@@ -806,8 +805,7 @@
 
 __DEVICE__
 double frexp(double __x, int *__nptr) {
-  *__nptr = __builtin_amdgcn_frexp_exp(__x);
-  return __builtin_amdgcn_frexp_mant(__x);
+  return __builtin_frexp(__x, __nptr);
 }
 
 __DEVICE__


Index: clang/test/Headers/__clang_hip_math.hip
===
--- clang/test/Headers/__clang_hip_math.hip
+++ clang/test/Headers/__clang_hip_math.hip
@@ -1061,37 +1061,25 @@
   return fmod(x, y);
 }
 
-// DEFAULT-LABEL: @test_frexpf(
-// DEFAULT-NEXT:  entry:
-// DEFAULT-NEXT:[[TMP0:%.*]] = tail call i32 @llvm.amdgcn.frexp.exp.i32.f32(float [[X:%.*]])
-// DEFAULT-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa [[TBAA11:![0-9]+]]
-// DEFAULT-NEXT:[[TMP1:%.*]] = tail call contract float @llvm.amdgcn.frexp.mant.f32(float [[X]])
-// DEFAULT-NEXT:ret float [[TMP1]]
-//
-// FINITEONLY-LABEL: @test_frexpf(
-// FINITEONLY-NEXT:  entry:
-// FINITEONLY-NEXT:[[TMP0:%.*]] = tail call i32 @llvm.amdgcn.frexp.exp.i32.f32(float [[X:%.*]])
-// FINITEONLY-NEXT:store i32 [[TMP0]], ptr [[Y:%.*]], align 4, !tbaa [[TBAA11:![0-9]+]]
-// FINITEONLY-NEXT:[[TMP1:%.*]] = tail call nnan ninf contract float @llvm.amdgcn.frexp.mant.f32(float [[X]])
-// FINITEONLY-NEXT:ret float [[TMP1]]
+// CHECK-LABEL: @test_frexpf(
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:

[clang] 0874110 - [Driver] Change some Separate CC1 options to use the Joined = form

2023-06-06 Thread Fangrui Song via cfe-commits

Author: Fangrui Song
Date: 2023-06-06T15:12:45-07:00
New Revision: 087411010422ae50f412c74d3b1eeff0b680e74b

URL: 
https://github.com/llvm/llvm-project/commit/087411010422ae50f412c74d3b1eeff0b680e74b
DIFF: 
https://github.com/llvm/llvm-project/commit/087411010422ae50f412c74d3b1eeff0b680e74b.diff

LOG: [Driver] Change some Separate CC1 options to use the Joined = form

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/AST/Interp/depth-limit.cpp
clang/test/AST/Interp/depth-limit2.cpp
clang/test/CXX/expr/expr.const/p2-0x.cpp
clang/test/SemaCXX/constexpr-backtrace-limit.cpp
clang/test/SemaCXX/constexpr-depth.cpp
clang/test/SemaCXX/constexpr-steps.cpp
clang/test/SemaCXX/operator-arrow-depth.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 41dfafd9594fd..879f12fe3a1e3 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1502,8 +1502,12 @@ defm constant_cfstrings : 
BoolFOption<"constant-cfstrings",
   NegFlag,
   PosFlag>;
 def fconstant_string_class_EQ : Joined<["-"], "fconstant-string-class=">, 
Group;
-def fconstexpr_depth_EQ : Joined<["-"], "fconstexpr-depth=">, Group;
-def fconstexpr_steps_EQ : Joined<["-"], "fconstexpr-steps=">, Group;
+def fconstexpr_depth_EQ : Joined<["-"], "fconstexpr-depth=">, Group, 
Flags<[CC1Option]>,
+  HelpText<"Set the maximum depth of recursive constexpr function calls">,
+  MarshallingInfoInt, "512">;
+def fconstexpr_steps_EQ : Joined<["-"], "fconstexpr-steps=">, Group, 
Flags<[CC1Option]>,
+  HelpText<"Set the maximum number of steps in constexpr function evaluation">,
+  MarshallingInfoInt, "1048576">;
 def fexperimental_new_constant_interpreter : Flag<["-"], 
"fexperimental-new-constant-interpreter">, Group,
   HelpText<"Enable the experimental new constant interpreter">, 
Flags<[CC1Option]>,
   MarshallingInfoFlag>;
@@ -2974,8 +2978,9 @@ def : Joined<["-"], "ftemplate-depth-">, Group, 
Alias,
   MarshallingInfoInt, 
"DiagnosticOptions::DefaultTemplateBacktraceLimit">;
-def foperator_arrow_depth_EQ : Joined<["-"], "foperator-arrow-depth=">,
-   Group;
+def foperator_arrow_depth_EQ : Joined<["-"], "foperator-arrow-depth=">, 
Group, Flags<[CC1Option]>,
+  HelpText<"Maximum number of 'operator->'s to call for a member access">,
+  MarshallingInfoInt, "256">;
 
 def fsave_optimization_record : Flag<["-"], "fsave-optimization-record">,
   Group, HelpText<"Generate a YAML optimization record file">;
@@ -6391,15 +6396,6 @@ def ftype_visibility : Joined<["-"], 
"ftype-visibility=">,
 def fapply_global_visibility_to_externs : Flag<["-"], 
"fapply-global-visibility-to-externs">,
   HelpText<"Apply global symbol visibility to external declarations without an 
explicit visibility">,
   MarshallingInfoFlag>;
-def foperator_arrow_depth : Separate<["-"], "foperator-arrow-depth">,
-  HelpText<"Maximum number of 'operator->'s to call for a member access">,
-  MarshallingInfoInt, "256">;
-def fconstexpr_depth : Separate<["-"], "fconstexpr-depth">,
-  HelpText<"Maximum depth of recursive constexpr function calls">,
-  MarshallingInfoInt, "512">;
-def fconstexpr_steps : Separate<["-"], "fconstexpr-steps">,
-  HelpText<"Maximum number of steps in constexpr function evaluation">,
-  MarshallingInfoInt, "1048576">;
 def fbracket_depth : Separate<["-"], "fbracket-depth">,
   HelpText<"Maximum nesting level for parentheses, brackets, and braces">,
   MarshallingInfoInt, "256">;

diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index a832d32d43096..9089e655a13c5 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5970,21 +5970,9 @@ void Clang::ConstructJob(Compilation , const JobAction 
,
   addDebugPrefixMapArg(D, TC, Args, CmdArgs);
 
   Args.AddLastArg(CmdArgs, options::OPT_ftemplate_depth_EQ);
-
-  if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
-CmdArgs.push_back("-foperator-arrow-depth");
-CmdArgs.push_back(A->getValue());
-  }
-
-  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
-CmdArgs.push_back("-fconstexpr-depth");
-CmdArgs.push_back(A->getValue());
-  }
-
-  if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
-CmdArgs.push_back("-fconstexpr-steps");
-CmdArgs.push_back(A->getValue());
-  }
+  Args.AddLastArg(CmdArgs, options::OPT_foperator_arrow_depth_EQ);
+  Args.AddLastArg(CmdArgs, options::OPT_fconstexpr_depth_EQ);
+  Args.AddLastArg(CmdArgs, options::OPT_fconstexpr_steps_EQ);
 
   Args.AddLastArg(CmdArgs, options::OPT_fexperimental_library);
 

diff  --git a/clang/test/AST/Interp/depth-limit.cpp 
b/clang/test/AST/Interp/depth-limit.cpp
index a6d5e56b141c3..6c21e5e65f0e0 100644
--- 

[PATCH] D138473: clang/HIP: Inline frexp/frexpf implementations

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm closed this revision.
arsenm added a comment.

e1fa30d005afa32be1a8d490e99652cd56440826


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138473/new/

https://reviews.llvm.org/D138473

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


[PATCH] D138396: HIP: Directly call signbit builtins

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm added a comment.

ping


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138396/new/

https://reviews.llvm.org/D138396

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


[PATCH] D138399: HIP: Directly call isinf builtins

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm added a comment.

ping


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138399/new/

https://reviews.llvm.org/D138399

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


[PATCH] D138395: HIP: Directly call fmin/fmax builtins

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm added a comment.

ping


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138395/new/

https://reviews.llvm.org/D138395

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


[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Sam Clegg via Phabricator via cfe-commits
sbc100 added a comment.

In D150803#4401061 , @sunfish wrote:

> wasm_jspi works for me.

The problem with that is that we will also likely want to use this attribute 
for asyncify (which is the current async approach we have today) as well as 
JSPI (which is hopefully coming soon)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D151277: [clang][modules] Mark fewer identifiers as out-of-date

2023-06-06 Thread Michael Spencer via Phabricator via cfe-commits
Bigcheese accepted this revision.
Bigcheese added a comment.

Looks good, although I'm not an expert on this bit either.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151277/new/

https://reviews.llvm.org/D151277

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


[PATCH] D150843: [clang][Diagnostics] Refactor printableTextForNextCharacter

2023-06-06 Thread Tom Honermann via Phabricator via cfe-commits
tahonermann added a comment.

The changes look good to me. I suggested two minor edits to align with 
parameter name changes.

The summary states that the changes are not quite NFC. In that case, we would 
ideally have a test that demonstrates the changed behavior. Would adding such a 
test be challenging?




Comment at: clang/lib/Frontend/TextDiagnostic.cpp:94
 /// \param SourceLine The line of source
 /// \param i Pointer to byte index,
 /// \param TabStop used to expand tabs





Comment at: clang/lib/Frontend/TextDiagnostic.cpp:101
   unsigned TabStop) {
-  assert(i && "i must not be null");
-  assert(*ihttps://reviews.llvm.org/D150843/new/

https://reviews.llvm.org/D150843

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


[PATCH] D150226: [Clang] Remove ability to downgrade warning on the diagnostic for setting a non fixed enum to a value outside the range of the enumeration values

2023-06-06 Thread James Y Knight via Phabricator via cfe-commits
jyknight added a comment.

In D150226#4400782 , @rupprecht wrote:

> As a general question/feature request: is there a way to have specific 
> warnings apply even for system headers? It would be nice if I could check 
> what breaks when by adding `-Wsystem-error=enum-constexpr-conversion` to the 
> global build flags. Rebuilding clang w/ this patched in also works, but is a 
> little more difficult/noisy.

I think there's no per-warning flag (you can turn on _all_ of the enabled 
warnings in system headers with `-Wsystem-headers`), but by modifying the clang 
sources you can add `ShowInSystemHeader` to the diagnostic.
E.g.

   def warn_constexpr_unscoped_enum_out_of_range : Warning<
 "integer value %0 is outside the valid range of values [%1, %2] for this "
  -  "enumeration type">, DefaultError, 
InGroup>;
  +  "enumeration type">, DefaultError, 
InGroup>, ShowInSystemHeader;


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150226/new/

https://reviews.llvm.org/D150226

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


[PATCH] D150209: [clang][Interp] Add more shift error checking

2023-06-06 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman accepted this revision.
aaron.ballman added a comment.

LGTM!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150209/new/

https://reviews.llvm.org/D150209

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


[PATCH] D138473: clang/HIP: Inline frexp/frexpf implementations

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm added a comment.
Herald added a subscriber: jplehr.

After D149716  this can switch to use the new 
builtin, and thus restores the ye olde southern islands workaround


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D138473/new/

https://reviews.llvm.org/D138473

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


[PATCH] D150913: [Clang][BFloat16] Upgrade __bf16 to arithmetic type, change mangling, and extend excess precision support.

2023-06-06 Thread Tom Honermann via Phabricator via cfe-commits
tahonermann added a comment.

I'm late to review and can no longer stamp an approval on this, but I'll note 
for the historical record that the changes look good to me.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150913/new/

https://reviews.llvm.org/D150913

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


[PATCH] D144911: adding bf16 support to NVPTX

2023-06-06 Thread Artem Belevich via Phabricator via cfe-commits
tra added inline comments.



Comment at: llvm/lib/Target/NVPTX/NVPTXISelLowering.cpp:615
 setFP16OperationAction(Op, MVT::v2f16, Legal, Expand);
-  }
-
-  for (const auto  : {ISD::FADD, ISD::FMUL, ISD::FSUB, ISD::FMA}) {
 setBF16OperationAction(Op, MVT::bf16, Legal, Promote);
 setBF16OperationAction(Op, MVT::v2bf16, Legal, Expand);

kushanam wrote:
> tra wrote:
> > There's still something odd with this patch. The `setBF16OperationAction` 
> > is not in the upstream, but it does not show up in the diff on phabricator. 
> > 
> > Please do rebase on top of the LLVM and make sure that all your changes are 
> > on the git branch you use to send the patch to phabricator. If in doubt how 
> > to get `arc` to do it correctly, you can always create and upload the diff 
> > manually as described here: 
> > https://llvm.org/docs/Phabricator.html#requesting-a-review-via-the-web-interface
> It is in the first commit, isn't it?https://reviews.llvm.org/D144911?id=500896
It *was* in the first revision of the patch, but it's not in the current one.

The phabricator commit history tracks evolution of the single patch, not a 
dependent set of patches. If you need a dependent patch, that's done via 
submitting each patch individually (i.e. with its own phabricator ID) and then 
recording their relationship via  "Edit related revisions -> Edit child/parent 
revisions". After that you will see them arranged under "stack" sub-tab in the 
"Revision contents" section



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144911/new/

https://reviews.llvm.org/D144911

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


[PATCH] D139837: [Clang] Implements CTAD for aggregates P1816R0 and P2082R1

2023-06-06 Thread Corentin Jabot via Phabricator via cfe-commits
cor3ntin added a comment.

I think this looks good but I'll let @aaron.ballman do the final approval.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D139837/new/

https://reviews.llvm.org/D139837

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


[PATCH] D152096: [Clang] Check for abstract parameters only when functions are defined.

2023-06-06 Thread Corentin Jabot via Phabricator via cfe-commits
cor3ntin updated this revision to Diff 529045.
cor3ntin marked 2 inline comments as done.
cor3ntin added a comment.

Address Aaron's comments.

Initially these changes were tracked in
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0929r2.html

I fixed the specific github issue but more work is needed to acertain 
conformance.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152096/new/

https://reviews.llvm.org/D152096

Files:
  clang/docs/ReleaseNotes.rst
  clang/lib/Sema/SemaChecking.cpp
  clang/lib/Sema/SemaDecl.cpp
  clang/lib/Sema/SemaDeclCXX.cpp
  clang/test/CXX/class.derived/class.abstract/p3.cpp
  clang/test/CXX/drs/dr6xx.cpp
  clang/test/SemaCXX/abstract.cpp
  clang/test/SemaCXX/auto-type-from-cxx.cpp
  clang/test/SemaObjCXX/parameters.mm

Index: clang/test/SemaObjCXX/parameters.mm
===
--- clang/test/SemaObjCXX/parameters.mm
+++ clang/test/SemaObjCXX/parameters.mm
@@ -11,9 +11,9 @@
 X0 x0a; // expected-note{{instantiation}}
 
 
-struct test2 { virtual void foo() = 0; }; // expected-note {{unimplemented}}
+struct test2 { virtual void foo() = 0; };
 @interface Test2
-- (void) foo: (test2) foo; // expected-error {{parameter type 'test2' is an abstract class}}
+- (void) foo: (test2) foo ;
 @end
 
 template void r1(__restrict T);
Index: clang/test/SemaCXX/auto-type-from-cxx.cpp
===
--- clang/test/SemaCXX/auto-type-from-cxx.cpp
+++ clang/test/SemaCXX/auto-type-from-cxx.cpp
@@ -21,18 +21,18 @@
 namespace TestDeductionFail {
 
 template
-void caller(T x) {x.fun();} // expected-note {{candidate template ignored: substitution failure [with T = TestDeductionFail::Abstract]: parameter type 'TestDeductionFail::Abstract' is an abstract class}}
+void caller(T x) {x.fun();} // expected-error {{parameter type 'TestDeductionFail::Abstract' is an abstract class}}
 
 template
 auto getCaller(){
-  return caller; // expected-error {{cannot deduce return type 'auto' from returned value of type ''}}
+  return caller; // expected-note {{in instantiation of function template specialization 'TestDeductionFail::caller' requested here}}
 }
 
 class Abstract{
   public:
 void fun();
-virtual void vfun()=0;
-void call(){getCaller()(*this);} // expected-note {{in instantiation of function template specialization 'TestDeductionFail::getCaller' requested here}}
+virtual void vfun()=0; // expected-note {{unimplemented pure virtual method 'vfun' in 'Abstract'}}
+void call(){getCaller()(*this);} // expected-error {{allocating an object of abstract class type 'TestDeductionFail::Abstract'}}
 };
 
 }
Index: clang/test/SemaCXX/abstract.cpp
===
--- clang/test/SemaCXX/abstract.cpp
+++ clang/test/SemaCXX/abstract.cpp
@@ -32,42 +32,48 @@
 C *d = new C; // expected-error {{allocating an object of abstract class type 'C'}}
 
 C c; // expected-error {{variable type 'C' is an abstract class}}
-void t1(C c); // expected-error {{parameter type 'C' is an abstract class}}
-void t2(C); // expected-error {{parameter type 'C' is an abstract class}}
+void t1(C c);
+void t2(C);
+void t3(C c){} // expected-error {{parameter type 'C' is an abstract class}}
+void t4(C){} // expected-error {{parameter type 'C' is an abstract class}}
 
 struct S {
   C c; // expected-error {{field type 'C' is an abstract class}}
 };
 
-void t3(const C&);
+void t5(const C&);
 
 void f() {
   C(); // expected-error {{allocating an object of abstract class type 'C'}}
-  t3(C()); // expected-error {{allocating an object of abstract class type 'C'}}
+  t5(C()); // expected-error {{allocating an object of abstract class type 'C'}}
 }
 
 C e1[2]; // expected-error {{array of abstract class type 'C'}}
 C (*e2)[2]; // expected-error {{array of abstract class type 'C'}}
 C (**e3)[2]; // expected-error {{array of abstract class type 'C'}}
 
-void t4(C c[2]); // expected-error {{array of abstract class type 'C'}}
+void t6(C c[2]); // expected-error {{array of abstract class type 'C'}}
 
-void t5(void (*)(C)); // expected-error {{parameter type 'C' is an abstract class}}
+void t7(void (*)(C));
 
-typedef void (*Func)(C); // expected-error {{parameter type 'C' is an abstract class}}
-void t6(Func);
+typedef void (*Func)(C);
+void t8(Func);
 
 class F {
   F a() { while (1) {} } // expected-error {{return type 'F' is an abstract class}}
-
+
   class D {
-void f(F c); // expected-error {{parameter type 'F' is an abstract class}}
+void f(F c){}  // expected-error {{parameter type 'F' is an abstract class}}
+void g(F c);
+void h(F c) = delete;
   };
 
   union U {
-void u(F c); // expected-error {{parameter type 'F' is an abstract class}}
+void u(F c){} // expected-error {{parameter type 'F' is an abstract class}}
+void v(F c);
+void w(F c) = delete;
   };
-
+
   virtual void f() = 0; // 

[PATCH] D152226: [FunctionAttrs] Propagate some func/arg/ret attributes from caller to callsite (WIP)

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm added inline comments.



Comment at: llvm/include/llvm/Transforms/Utils/InferCallsiteAttrs.h:1
+#ifndef LLVM_TRANSFORMS_UTILS_INFERCALLSITEATTRS_H
+#define LLVM_TRANSFORMS_UTILS_INFERCALLSITEATTRS_H

Missing license header



Comment at: llvm/include/llvm/Transforms/Utils/InferCallsiteAttrs.h:10-12
+  static constexpr uint8_t kMaybe = 0;
+  static constexpr uint8_t kYes = 1;
+  static constexpr uint8_t kNo = 2;

Why not a regular enum?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152226/new/

https://reviews.llvm.org/D152226

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


[PATCH] D151532: [test] Test ext_vector_type operators with implicit conversions

2023-06-06 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman accepted this revision.
aaron.ballman added a comment.
This revision is now accepted and ready to land.

LGTM! Thank you for the extra test coverage.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151532/new/

https://reviews.llvm.org/D151532

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


[PATCH] D149573: [Clang][C++23] Implement core language changes from P1467R9 extended floating-point types and standard names

2023-06-06 Thread Tom Honermann via Phabricator via cfe-commits
tahonermann added a comment.

This is looking good to me. I added a few comments seeking clarification.

I'm concerned about the changes to the existing calls to 
`getFloatingTypeOrder()`. The changes look like they will preserve prior 
behavior for standard types just fine, but I'm not sure whether they implement 
the right behavior for the extended types. Defining comparison functions that 
are explicit in their handling of `FRCR_Unordered` and subrank comparisons 
would help me feel more confident about the changes, the intent, and my ability 
to audit for the desired behavior.




Comment at: clang/include/clang/Lex/LiteralSupport.h:75
   bool isBitInt : 1;// 1wb, 1uwb (C2x)
+  bool isBF16 : 1;  // 1.0bf
   uint8_t MicrosoftInteger; // Microsoft suffix extension i8, i16, i32, or i64.

codemzs wrote:
> tahonermann wrote:
> > Is this for `__bf16` or for `std::bfloat16_t`?
> Its for `std::bfloat16_t`, I don't believe `__bf16` has a literal suffix. 
I guess it does now! :)



Comment at: clang/lib/AST/ASTContext.cpp:126-127
+return 4;
+  default:
+llvm_unreachable("Not a CXX23+ floating point builtin type");
+  }

Assuming there is no need to handle `__float128` and `__ibm128` here, how about 
a comment to state why they don't require support here?



Comment at: clang/lib/Sema/Sema.cpp:706
+auto conversionRank = Context.getFloatingTypeOrder(TypeTy, ExprTy);
+if (conversionRank < FRCR_Greater) {
+  Diag(E->getExprLoc(),

This comparison depends on the order of the enumerators in 
`FloatingRankCompareResult` and that seems brittle. I suggest either 
encompassing such comparisons in a function or, at least, adding a comment to 
the enumeration definition that explains the ordering requirements.



Comment at: clang/lib/Sema/SemaCast.cpp:1367
+  Self.Context.doCXX23ExtendedFpTypesRulesApply(DestType, SrcType)) {
+// Support for cast between fp16 and bf16 doesn't exist yet.
+if (!((DestType->isBFloat16Type() || DestType->isFloat16Type()) &&

Should this be a FIXME comment? What happens in this case? Should we perhaps 
assert on such attempted conversions?



Comment at: clang/lib/Sema/SemaExpr.cpp:1235-1237
+if (order == FRCR_Unordered) {
+  return QualType();
+}

Return of an invalid type is a new behavior for this function and it isn't 
clear to me that callers will handle it (or be expected to handle it) such that 
a diagnostic will be generated. Perhaps a diagnostic should be issued here? Or 
perhaps this should be an assertion?



Comment at: clang/lib/Sema/SemaOverload.cpp:4202
+  if (S.Context.getFloatingTypeOrder(SCS2.getToType(1),
+ SCS1.getFromType()) < FRCR_Equal) 
{
+return ImplicitConversionSequence::Better;

This comparison includes `FRCR_Unordered`, is that intended? (another case at 
line 4225 below)


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D149573/new/

https://reviews.llvm.org/D149573

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


[PATCH] D152226: [FunctionAttrs] Propagate some func/arg/ret attributes from caller to callsite (WIP)

2023-06-06 Thread Noah Goldstein via Phabricator via cfe-commits
goldstein.w.n added inline comments.



Comment at: libc/CMakeLists.txt:22
+# that clang will use it.
+if(LLVM_LIBC_MAKE_DISCOVERABLE)
+  if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)

sivachandra wrote:
> Likely out of date and not required for this patch?
woops, left that in from the bug earlier.
Fixed.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152226/new/

https://reviews.llvm.org/D152226

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


[clang] 5805aeb - [test] Restore x86-registered-target in Driver/as-warnings.c

2023-06-06 Thread Fangrui Song via cfe-commits

Author: Fangrui Song
Date: 2023-06-06T14:08:49-07:00
New Revision: 5805aeb0d924805c4ea132829debfaedcbcb0e76

URL: 
https://github.com/llvm/llvm-project/commit/5805aeb0d924805c4ea132829debfaedcbcb0e76
DIFF: 
https://github.com/llvm/llvm-project/commit/5805aeb0d924805c4ea132829debfaedcbcb0e76.diff

LOG: [test] Restore x86-registered-target in Driver/as-warnings.c

64666d46c0bb0575e62525a5b867569b32850116 incorrectly removed REQUIRES.
2 RUN lines do need x86-registered-target.

Added: 


Modified: 
clang/test/Driver/as-warnings.c

Removed: 




diff  --git a/clang/test/Driver/as-warnings.c b/clang/test/Driver/as-warnings.c
index c72ea34ff8a71..e05df870e4556 100644
--- a/clang/test/Driver/as-warnings.c
+++ b/clang/test/Driver/as-warnings.c
@@ -10,8 +10,8 @@
 // RUN: %clang -### --target=x86_64-pc-linux-gnu %s -c -o tmp.o -integrated-as 
-Wa,-W 2>&1 | FileCheck %s
 
 /// Make sure warnings behave properly in integrated assembler.
-// RUN: %clang --target=x86_64-pc-linux-gnu %s -c -o %t.o -integrated-as 
-Wa,--no-warn 2>&1 | FileCheck -allow-empty --check-prefix=CHECK-AS-NOWARN %s
-// RUN: not %clang --target=x86_64-pc-linux-gnu %s -c -o %t.o -integrated-as 
-Wa,--fatal-warnings 2>&1 | FileCheck --check-prefix=CHECK-AS-FATAL %s
+// RUN: %if x86-registered-target %{ %clang --target=x86_64 %s -c -o /dev/null 
-fintegrated-as -Wa,--no-warn 2>&1 | count 0 %}
+// RUN: %if x86-registered-target %{ not %clang --target=x86_64 %s -c -o 
/dev/null -fintegrated-as -Wa,--fatal-warnings 2>&1 | FileCheck 
--check-prefix=CHECK-AS-FATAL %s %}
 
 // CHECK: "-cc1" {{.*}} "-massembler-no-warn"
 // CHECK-NOIAS: "--no-warn"



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


[PATCH] D152017: [DebugInfo] Add flag to only emit referenced member functions

2023-06-06 Thread David Blaikie via Phabricator via cfe-commits
dblaikie added a comment.

In D152017#4400735 , @probinson wrote:

> Oh, `-fstandalone-debug` should override this? In the Sony implementation, it 
> does. (Sorry for not remembering that sooner.)

I'd think of this as orthogonal to that, potentially. by analogy with 
non-member functions. Even in standalone debug, we wouldn't emit a declaration 
for every function declared in a translation unit. Ah, because we include the 
mangled names on member function declarations, having that would still allow 
you to call the function from another translation unit, if it's available, even 
without DWARF for that TU, I suppose.

So, while it's inconsistent with non-member functions, which doesn't seem like 
a good principle - yeah, guess we could imply this option is disabled by 
`-fstandalone-debug`...

In D152017#4400449 , @rnk wrote:

> I tend to think that enabled-by-default options which have names that you are 
> supposed to prefix with no are awkward[1], but the compiler ecosystem (GCC & 
> Clang) has lots of those, and perhaps we should lean into it. I like 
> `-g[no-]undefined-methods` the best of Paul's suggestions.
>
> [1]  `-fdelete-null-pointer-checks`, anyone? Yes, that's a feature I want in 
> my compiler, please delete my null checks, I didn't need those, sign me up!

Yeah, mixed feelings about a default-on flag, so you have to use `-gno-*`. 
Though one name in that form, might be `-gno-canonical-types`.
(pedantically C++ calls these things "member functions" (& it seems nice to use 
consistent naming) rather than "methods", but 
`-g[no-]undefined-member-functions` would be a bit of a mouthful... )


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152017/new/

https://reviews.llvm.org/D152017

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


[clang] 8a21ea1 - clang: Start emitting intrinsic for __builtin_ldexp*

2023-06-06 Thread Matt Arsenault via cfe-commits

Author: Matt Arsenault
Date: 2023-06-06T17:07:19-04:00
New Revision: 8a21ea1d0a3883a8d0aa15440388f91e49da4d08

URL: 
https://github.com/llvm/llvm-project/commit/8a21ea1d0a3883a8d0aa15440388f91e49da4d08
DIFF: 
https://github.com/llvm/llvm-project/commit/8a21ea1d0a3883a8d0aa15440388f91e49da4d08.diff

LOG: clang: Start emitting intrinsic for __builtin_ldexp*

Also introduce __builtin_ldexpf16.

Added: 


Modified: 
clang/include/clang/Basic/Builtins.def
clang/lib/CodeGen/CGBuiltin.cpp
clang/test/CodeGen/aix-builtin-mapping.c
clang/test/CodeGen/constrained-math-builtins.c
clang/test/CodeGen/math-builtins.c
clang/test/CodeGenOpenCL/builtins-f16.cl
clang/test/CodeGenOpenCL/builtins-generic-amdgcn.cl

Removed: 




diff  --git a/clang/include/clang/Basic/Builtins.def 
b/clang/include/clang/Basic/Builtins.def
index c8f955a1f4b28..4f18c48d0ce40 100644
--- a/clang/include/clang/Basic/Builtins.def
+++ b/clang/include/clang/Basic/Builtins.def
@@ -159,6 +159,7 @@ BUILTIN(__builtin_ldexp , "ddi"  , "Fne")
 BUILTIN(__builtin_ldexpf, "ffi"  , "Fne")
 BUILTIN(__builtin_ldexpl, "LdLdi", "Fne")
 BUILTIN(__builtin_ldexpf128, "LLdLLdi", "Fne")
+BUILTIN(__builtin_ldexpf16, "hhi", "Fne")
 BUILTIN(__builtin_modf , "ddd*"  , "Fn")
 BUILTIN(__builtin_modff, "fff*"  , "Fn")
 BUILTIN(__builtin_modfl, "LdLdLd*", "Fn")

diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index ddf28dc166636..d958198c5aef3 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -540,6 +540,25 @@ static Value 
*emitBinaryMaybeConstrainedFPBuiltin(CodeGenFunction ,
   }
 }
 
+// Has second type mangled argument.
+static Value *emitBinaryExpMaybeConstrainedFPBuiltin(
+CodeGenFunction , const CallExpr *E, llvm::Intrinsic::ID IntrinsicID,
+llvm::Intrinsic::ID ConstrainedIntrinsicID) {
+  llvm::Value *Src0 = CGF.EmitScalarExpr(E->getArg(0));
+  llvm::Value *Src1 = CGF.EmitScalarExpr(E->getArg(1));
+
+  if (CGF.Builder.getIsFPConstrained()) {
+CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, E);
+Function *F = CGF.CGM.getIntrinsic(ConstrainedIntrinsicID,
+   {Src0->getType(), Src1->getType()});
+return CGF.Builder.CreateConstrainedFPCall(F, {Src0, Src1});
+  }
+
+  Function *F =
+  CGF.CGM.getIntrinsic(IntrinsicID, {Src0->getType(), Src1->getType()});
+  return CGF.Builder.CreateCall(F, {Src0, Src1});
+}
+
 // Emit an intrinsic that has 3 operands of the same type as its result.
 // Depending on mode, this may be a constrained floating-point intrinsic.
 static Value *emitTernaryMaybeConstrainedFPBuiltin(CodeGenFunction ,
@@ -2567,7 +2586,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl 
GD, unsigned BuiltinID,
   return RValue::get(emitMaybeConstrainedFPToIntRoundBuiltin(
   *this, E, Intrinsic::llrint,
   Intrinsic::experimental_constrained_llrint));
-
+case Builtin::BI__builtin_ldexp:
+case Builtin::BI__builtin_ldexpf:
+case Builtin::BI__builtin_ldexpl:
+case Builtin::BI__builtin_ldexpf16:
+case Builtin::BI__builtin_ldexpf128: {
+  return RValue::get(emitBinaryExpMaybeConstrainedFPBuiltin(
+  *this, E, Intrinsic::ldexp,
+  Intrinsic::experimental_constrained_ldexp));
+}
 default:
   break;
 }
@@ -3035,6 +3062,8 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl 
GD, unsigned BuiltinID,
 llvm::Value *Src1 = EmitScalarExpr(E->getArg(1));
 
 if (Builder.getIsFPConstrained()) {
+  // FIXME: llvm.powi has 2 mangling types,
+  // llvm.experimental.constrained.powi has one.
   CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E);
   Function *F = CGM.getIntrinsic(Intrinsic::experimental_constrained_powi,
  Src0->getType());

diff  --git a/clang/test/CodeGen/aix-builtin-mapping.c 
b/clang/test/CodeGen/aix-builtin-mapping.c
index 57ea558652e1a..98fcfd4a3a6fc 100644
--- a/clang/test/CodeGen/aix-builtin-mapping.c
+++ b/clang/test/CodeGen/aix-builtin-mapping.c
@@ -19,4 +19,4 @@ int main()
 
 // CHECK: %call = call double @modf(double noundef 1.00e+00, ptr noundef 
%DummyLongDouble) #3
 // CHECK: %call1 = call double @frexp(double noundef 0.00e+00, ptr noundef 
%DummyInt) #3
-// CHECK: %call2 = call double @ldexp(double noundef 1.00e+00, i32 noundef 
{{(signext )?}}1) #4
+// CHECK: %{{.+}} = call double @llvm.ldexp.f64.i32(double 1.00e+00, i32 1)

diff  --git a/clang/test/CodeGen/constrained-math-builtins.c 
b/clang/test/CodeGen/constrained-math-builtins.c
index cccfd8bc7746a..88ae8f58a7e20 100644
--- a/clang/test/CodeGen/constrained-math-builtins.c
+++ b/clang/test/CodeGen/constrained-math-builtins.c
@@ -7,7 +7,7 @@
 
 #pragma float_control(except, on)
 
-void foo(double *d, float f, float *fp, long double *l, int *i, const char *c) 
{
+void foo(double *d, float f, 

[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Dan Gohman via Phabricator via cfe-commits
sunfish added a comment.

wasm_jspi works for me.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D151373: [libclang] Expose arguments of clang::annotate{_type}

2023-06-06 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added a comment.

Thank you for the additions! This should have test coverage in 
clang/unitttests/libclang/LibclangTest.cpp and a release note.




Comment at: clang/tools/libclang/CIndex.cpp:2745
 }
+// TODO these two methods are exactly the same. Can this be expressed better?
+void EnqueueVisitor::EnqueueChildren(const AnnotateAttr *A) {

We could use a template type and enable_if (for some type safety), then it 
shares the implementation.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151373/new/

https://reviews.llvm.org/D151373

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


[PATCH] D152090: [clang][Driver] Add -fcaret-diagnostics-max-lines as a driver option

2023-06-06 Thread Fangrui Song via Phabricator via cfe-commits
MaskRay added a comment.

In D152090#4398097 , @tbaeder wrote:

> In D152090#4395827 , @MaskRay wrote:
>
>> `def fcaret_diagnostics_max_lines` in `Options.td` has the `NoDriverOption` 
>> flag. Move it to other places with `BooleainFFlag` should work. 
>> Then in `Clang.cpp` you can just write `Args.AddLastArg(...)`
>>
>> Can you add some description that this is related to D147875 
>>  ?
>
> Can you give a more concrete example? I modeled this patch after existing 
> similar options, like `-fmacro-backtrace-limit`.

Thanks for mentioning `-fmacro-backtrace-limit`. I changed it and a few similar 
options to the perfered form in 0aa4af711e567c8683cee95ffbb14812df03cecc 


We have many legacy `Separate` form CC1 options that unnecessarily differ from 
their `Joined` (ended with `=`) driver option counterparts.
New code is recommended to use `Flags<[CC1Option]>,`.
As a general advice, if you see `Separate`, chances are that they likely don't 
use the best practice...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152090/new/

https://reviews.llvm.org/D152090

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


[clang] 0aa4af7 - [Driver] Change some Separate CC1 options to use the Joined = form

2023-06-06 Thread Fangrui Song via cfe-commits

Author: Fangrui Song
Date: 2023-06-06T13:50:04-07:00
New Revision: 0aa4af711e567c8683cee95ffbb14812df03cecc

URL: 
https://github.com/llvm/llvm-project/commit/0aa4af711e567c8683cee95ffbb14812df03cecc
DIFF: 
https://github.com/llvm/llvm-project/commit/0aa4af711e567c8683cee95ffbb14812df03cecc.diff

LOG: [Driver] Change some Separate CC1 options to use the Joined = form

-f{constexpr,macro,template}-backtrace-limit=, -fspell-checking-limit=, 
-ftemplate-depth=

Added: 


Modified: 
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Misc/macro-backtrace.c
clang/test/Misc/reduced-diags-macros-backtrace.cpp
clang/test/SemaCXX/constexpr-backtrace-limit.cpp
clang/test/SemaCXX/typo-correction.cpp
clang/test/SemaTemplate/instantiate-exception-spec-cxx11.cpp
clang/test/SemaTemplate/instantiation-depth-defarg.cpp
clang/test/SemaTemplate/instantiation-depth-default.cpp
clang/test/SemaTemplate/instantiation-depth-exception-spec.cpp
clang/test/SemaTemplate/instantiation-depth-subst-2.cpp
clang/test/SemaTemplate/instantiation-depth-subst.cpp
clang/test/SemaTemplate/instantiation-depth.cpp

Removed: 




diff  --git a/clang/include/clang/Driver/Options.td 
b/clang/include/clang/Driver/Options.td
index 29b41002cf37b..41dfafd9594fd 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1507,8 +1507,9 @@ def fconstexpr_steps_EQ : Joined<["-"], 
"fconstexpr-steps=">, Group;
 def fexperimental_new_constant_interpreter : Flag<["-"], 
"fexperimental-new-constant-interpreter">, Group,
   HelpText<"Enable the experimental new constant interpreter">, 
Flags<[CC1Option]>,
   MarshallingInfoFlag>;
-def fconstexpr_backtrace_limit_EQ : Joined<["-"], 
"fconstexpr-backtrace-limit=">,
-Group;
+def fconstexpr_backtrace_limit_EQ : Joined<["-"], 
"fconstexpr-backtrace-limit=">, Group, Flags<[CC1Option]>,
+  HelpText<"Set the maximum number of entries to print in a constexpr 
evaluation backtrace (0 = no limit)">,
+  MarshallingInfoInt, 
"DiagnosticOptions::DefaultConstexprBacktraceLimit">;
 def fcrash_diagnostics_EQ : Joined<["-"], "fcrash-diagnostics=">, 
Group, Flags<[NoArgumentUnused, CoreOption]>,
   HelpText<"Set level of crash diagnostic reporting, (option: off, compiler, 
all)">;
 def fcrash_diagnostics : Flag<["-"], "fcrash-diagnostics">, 
Group, Flags<[NoArgumentUnused, CoreOption]>,
@@ -2289,7 +2290,9 @@ def fthin_link_bitcode_EQ : Joined<["-"], 
"fthin-link-bitcode=">,
   HelpText<"Write minimized bitcode to  for the ThinLTO thin link only">,
   MarshallingInfoString>;
 def fmacro_backtrace_limit_EQ : Joined<["-"], "fmacro-backtrace-limit=">,
-Group, Flags<[NoXarchOption, 
CoreOption]>;
+  Group, Flags<[NoXarchOption, CC1Option, CoreOption]>,
+  HelpText<"Set the maximum number of entries to print in a macro expansion 
backtrace (0 = no limit)">,
+  MarshallingInfoInt, 
"DiagnosticOptions::DefaultMacroBacktraceLimit">;
 defm merge_all_constants : BoolFOption<"merge-all-constants",
   CodeGenOpts<"MergeAllConstants">, DefaultFalse,
   PosFlag, NegFlag,
@@ -2893,7 +2896,9 @@ defm show_source_location : 
BoolFOption<"show-source-location",
 defm spell_checking : BoolFOption<"spell-checking",
   LangOpts<"SpellChecking">, DefaultTrue,
   NegFlag, PosFlag>;
-def fspell_checking_limit_EQ : Joined<["-"], "fspell-checking-limit=">, 
Group;
+def fspell_checking_limit_EQ : Joined<["-"], "fspell-checking-limit=">, 
Group, Flags<[CC1Option]>,
+  HelpText<"Set the maximum number of times to perform spell checking on 
unrecognized identifiers (0 = no limit)">,
+  MarshallingInfoInt, 
"DiagnosticOptions::DefaultSpellCheckingLimit">;
 def fsigned_bitfields : Flag<["-"], "fsigned-bitfields">, Group;
 defm signed_char : BoolFOption<"signed-char",
   LangOpts<"CharIsSigned">, DefaultTrue,
@@ -2962,10 +2967,13 @@ def fsyntax_only : Flag<["-"], "fsyntax-only">,
   Flags<[NoXarchOption,CoreOption,CC1Option,FC1Option,FlangOption]>, 
Group,
   HelpText<"Run the preprocessor, parser and semantic analysis stages">;
 def ftabstop_EQ : Joined<["-"], "ftabstop=">, Group;
-def ftemplate_depth_EQ : Joined<["-"], "ftemplate-depth=">, Group;
-def ftemplate_depth_ : Joined<["-"], "ftemplate-depth-">, Group;
-def ftemplate_backtrace_limit_EQ : Joined<["-"], "ftemplate-backtrace-limit=">,
-   Group;
+def ftemplate_depth_EQ : Joined<["-"], "ftemplate-depth=">, Group, 
Flags<[CC1Option]>,
+  HelpText<"Set the maximum depth of recursive template instantiation">,
+  MarshallingInfoInt, "1024">;
+def : Joined<["-"], "ftemplate-depth-">, Group, 
Alias;
+def ftemplate_backtrace_limit_EQ : Joined<["-"], 
"ftemplate-backtrace-limit=">, Group, Flags<[CC1Option]>,
+  HelpText<"Set the maximum number of entries to print in a template 
instantiation backtrace (0 = 

[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Brendan Dahl via Phabricator via cfe-commits
brendandahl marked an inline comment as done.
brendandahl added a comment.

In D150803#4389062 , @sunfish wrote:

> In D150803#4389040 , @dschuff wrote:
>
>> Hm, this is interesting because in the long term we plan to have stack 
>> switching in wasm, which could allow for similar async behavior that JSPI 
>> has, and could be useful in non-web systems. But that's a ways off. The file 
>> format we are generating with this CL will be used in emscripten sooner (and 
>> we may want to try to stabilize it some point, possibly before pure wasm 
>> stack switching is usable in non-web systems).
>> So overall I kind of feel like I could go either way on this. Curious if 
>> @sunfish has had any thoughts about async outside of emscripten.
>
> When we do have stack switching, would you anticipate still using this 
> `wasm_async` attribute, or would we switch to something else at that point?

It's unclear to me at the moment how we're going to implement full stack 
switching with emscripten/llvm. I'm not attached to the `wasm_async` name, so 
we could be more specific and use `wasm_jspi` or something else?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D151820: [clang][WebAssembly] Fix __BIGGEST_ALIGNMENT__ under emscripten

2023-06-06 Thread Sam Clegg via Phabricator via cfe-commits
sbc100 added a comment.

In D151820#4400795 , @tlively wrote:

> In D151820#4385512 , @dschuff wrote:
>
>> I seem to recall that @tlively and I spent a bunch of time with XNNpack 
>> chasing down some kind of subtle error that I suspect had to do with 
>> alignment, but maybe he remembers that better than I do.
>
> Sorry, I have no recollection of this at all 

As far as I can tell the only way this change could break XNNpack if 
XNN_ALLOCATION_ALIGNMENT = 8 is wrongly set there... as long as that is the 
correct value for XNN_ALLOCATION_ALIGNMENT I don't see how this change could 
break it.  If XNN_ALLOCATION_ALIGNMENT is set wrongly this change might expose 
that bug.. but it seems correct to me.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151820/new/

https://reviews.llvm.org/D151820

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


[PATCH] D152021: [clang][AIX] Fix Overly Strick LTO Option Checking against `data-sections` when `mxcoff-roptr` is in Effect

2023-06-06 Thread Qiongsi Wu via Phabricator via cfe-commits
qiongsiwu1 updated this revision to Diff 529030.
qiongsiwu1 added a comment.

Address code review. Thanks @MaskRay  for the feedback!


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152021/new/

https://reviews.llvm.org/D152021

Files:
  clang/lib/Driver/ToolChains/CommonArgs.cpp
  clang/test/Driver/ppc-roptr.c


Index: clang/test/Driver/ppc-roptr.c
===
--- clang/test/Driver/ppc-roptr.c
+++ clang/test/Driver/ppc-roptr.c
@@ -12,7 +12,7 @@
 // RUN: %clang -### --target=powerpc-ibm-aix-xcoff %s 2>&1 | \
 // RUN: FileCheck %s --check-prefix=NO_ROPTR
 // RUN: %clang -### --target=powerpc64-ibm-aix-xcoff -mxcoff-roptr -flto %s 
2>&1 | \
-// RUN: FileCheck %s --check-prefixes=ROPTR,LINK,LTO_ROPTR
+// RUN: FileCheck %s 
--check-prefixes=NO_DATA_SECTION_ERR,ROPTR,LINK,LTO_ROPTR
 // RUN: touch %t.o
 // RUN: %clang -### --target=powerpc64-ibm-aix-xcoff -mxcoff-roptr %t.o 2>&1 | 
\
 // RUN: FileCheck %s --check-prefix=LINK
@@ -33,14 +33,14 @@
 // RUN: %clang -### --target=powerpc64le-unknown-linux-gnu -mno-xcoff-roptr 
-flto \
 // RUN: %t.o 2>&1 | FileCheck %s --check-prefix=TARGET_NOROPTR_ERR
 
-// ROPTR: "-mxcoff-roptr"
-// LINK: "-bforceimprw"
-// LTO_ROPTR: "-bplugin_opt:-mxcoff-roptr"
-// NO_ROPTR-NOT: "-mxcoff-roptr"
-// NO_ROPTR-NOT: "-bforceimprw"
-
 // DATA_SECTION_ERR: error: -mxcoff-roptr is supported only with 
-fdata-sections
 // NO_DATA_SECTION_ERR-NOT: error: -mxcoff-roptr is supported only with 
-fdata-sections
 // TARGET_ROPTR_ERR: error: unsupported option '-mxcoff-roptr' for target 
'powerpc64le-unknown-linux-gnu'
 // TARGET_NOROPTR_ERR: error: unsupported option '-mno-xcoff-roptr' for target 
'powerpc64le-unknown-linux-gnu'
 // SHARED_ERR: error: -mxcoff-roptr is not supported with -shared
+
+// ROPTR: "-mxcoff-roptr"
+// LINK: "-bforceimprw"
+// LTO_ROPTR: "-bplugin_opt:-mxcoff-roptr"
+// NO_ROPTR-NOT: "-mxcoff-roptr"
+// NO_ROPTR-NOT: "-bforceimprw"
Index: clang/lib/Driver/ToolChains/CommonArgs.cpp
===
--- clang/lib/Driver/ToolChains/CommonArgs.cpp
+++ clang/lib/Driver/ToolChains/CommonArgs.cpp
@@ -727,13 +727,16 @@
 CmdArgs.push_back(
 Args.MakeArgString(Twine(PluginOptPrefix) + "-function-sections=0"));
 
+  bool DataSectionsTurnedOff = false;
   if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
UseSeparateSections))
 CmdArgs.push_back(
 Args.MakeArgString(Twine(PluginOptPrefix) + "-data-sections=1"));
-  else if (Args.hasArg(options::OPT_fno_data_sections))
+  else if (Args.hasArg(options::OPT_fno_data_sections)) {
+DataSectionsTurnedOff = true;
 CmdArgs.push_back(
 Args.MakeArgString(Twine(PluginOptPrefix) + "-data-sections=0"));
+  }
 
   if (Args.hasArg(options::OPT_mxcoff_roptr) ||
   Args.hasArg(options::OPT_mno_xcoff_roptr)) {
@@ -746,8 +749,10 @@
   << OptStr << ToolChain.getTriple().str();
 
 if (HasRoptr) {
-  if (!Args.hasFlag(options::OPT_fdata_sections,
-options::OPT_fno_data_sections, UseSeparateSections))
+  // The data sections option is on by default on AIX. We only need to 
error
+  // out when -fno-data-sections is specified explicitly to turn off data
+  // sections.
+  if (DataSectionsTurnedOff)
 D.Diag(diag::err_roptr_requires_data_sections);
 
   CmdArgs.push_back(


Index: clang/test/Driver/ppc-roptr.c
===
--- clang/test/Driver/ppc-roptr.c
+++ clang/test/Driver/ppc-roptr.c
@@ -12,7 +12,7 @@
 // RUN: %clang -### --target=powerpc-ibm-aix-xcoff %s 2>&1 | \
 // RUN: FileCheck %s --check-prefix=NO_ROPTR
 // RUN: %clang -### --target=powerpc64-ibm-aix-xcoff -mxcoff-roptr -flto %s 2>&1 | \
-// RUN: FileCheck %s --check-prefixes=ROPTR,LINK,LTO_ROPTR
+// RUN: FileCheck %s --check-prefixes=NO_DATA_SECTION_ERR,ROPTR,LINK,LTO_ROPTR
 // RUN: touch %t.o
 // RUN: %clang -### --target=powerpc64-ibm-aix-xcoff -mxcoff-roptr %t.o 2>&1 | \
 // RUN: FileCheck %s --check-prefix=LINK
@@ -33,14 +33,14 @@
 // RUN: %clang -### --target=powerpc64le-unknown-linux-gnu -mno-xcoff-roptr -flto \
 // RUN: %t.o 2>&1 | FileCheck %s --check-prefix=TARGET_NOROPTR_ERR
 
-// ROPTR: "-mxcoff-roptr"
-// LINK: "-bforceimprw"
-// LTO_ROPTR: "-bplugin_opt:-mxcoff-roptr"
-// NO_ROPTR-NOT: "-mxcoff-roptr"
-// NO_ROPTR-NOT: "-bforceimprw"
-
 // DATA_SECTION_ERR: error: -mxcoff-roptr is supported only with -fdata-sections
 // NO_DATA_SECTION_ERR-NOT: error: -mxcoff-roptr is supported only with -fdata-sections
 // TARGET_ROPTR_ERR: error: unsupported option '-mxcoff-roptr' for target 'powerpc64le-unknown-linux-gnu'
 // TARGET_NOROPTR_ERR: error: unsupported option '-mno-xcoff-roptr' for target 'powerpc64le-unknown-linux-gnu'
 // SHARED_ERR: error: -mxcoff-roptr is not supported with 

[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Brendan Dahl via Phabricator via cfe-commits
brendandahl marked 2 inline comments as done.
brendandahl added inline comments.



Comment at: clang/lib/Sema/SemaDeclAttr.cpp:7638
+  D->addAttr(::new (S.Context) WebAssemblyAsyncAttr(S.Context, AL));
+  D->addAttr(UsedAttr::CreateImplicit(S.Context));
+}

erichkeane wrote:
> We should probably document that this forces the function to be emitted as 
> well.
I've removed this since we won't actually always want these functions 
preserved. I've changed the linker to now put a tombstone in the async section 
instead. I also added a new test for this.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

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


[PATCH] D150803: [WebAssembly] Add a new `wasm_async` clang attribute for marking async functions.

2023-06-06 Thread Brendan Dahl via Phabricator via cfe-commits
brendandahl updated this revision to Diff 529028.
brendandahl added a comment.

Review comments. Add tombstone for unused functions.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150803/new/

https://reviews.llvm.org/D150803

Files:
  clang/docs/ReleaseNotes.rst
  clang/include/clang/Basic/Attr.td
  clang/include/clang/Basic/AttrDocs.td
  clang/lib/CodeGen/TargetInfo.cpp
  clang/lib/Sema/SemaDeclAttr.cpp
  clang/test/CodeGen/WebAssembly/wasm-async.c
  clang/test/Misc/pragma-attribute-supported-attributes-list.test
  clang/test/Sema/attr-wasm-async.c
  clang/test/Sema/wasm-async-support.c
  lld/test/wasm/async-undefined.s
  lld/test/wasm/async.s
  lld/test/wasm/merge-async-section.ll
  lld/wasm/InputChunks.cpp
  lld/wasm/InputFiles.cpp
  llvm/include/llvm/BinaryFormat/WasmRelocs.def
  llvm/include/llvm/MC/MCExpr.h
  llvm/lib/MC/MCExpr.cpp
  llvm/lib/MC/WasmObjectWriter.cpp
  llvm/lib/Object/WasmObjectFile.cpp
  llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
  llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
  llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
  llvm/test/CodeGen/WebAssembly/async.ll
  llvm/test/MC/WebAssembly/async.s

Index: llvm/test/MC/WebAssembly/async.s
===
--- /dev/null
+++ llvm/test/MC/WebAssembly/async.s
@@ -0,0 +1,21 @@
+# RUN: llvm-mc -triple=wasm32-unknown-unknown < %s | FileCheck %s
+# Check that it also comiled to object for format.
+# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -o - < %s | obj2yaml | FileCheck -check-prefix=CHECK-OBJ %s
+
+foo:
+.globl foo
+.functype foo () -> ()
+end_function
+
+.section.custom_section.async,"",@
+.int32  foo@FUNCINDEX
+
+# CHECK:   .section .custom_section.async,"",@
+# CHECK-NEXT: .int32  foo@FUNCINDEX
+
+# CHECK-OBJ:- Type:CUSTOM
+# CHECK-OBJ-NEXT: Relocations:
+# CHECK-OBJ-NEXT:- Type:R_WASM_FUNCTION_INDEX_I32
+# CHECK-OBJ-NEXT:  Index:   0
+# CHECK-OBJ-NEXT:  Offset:  0x0
+# CHECK-OBJ-NEXT: Name:async
Index: llvm/test/CodeGen/WebAssembly/async.ll
===
--- /dev/null
+++ llvm/test/CodeGen/WebAssembly/async.ll
@@ -0,0 +1,17 @@
+; RUN: llc < %s -asm-verbose=false -wasm-keep-registers | FileCheck %s
+
+target triple = "wasm32-unknown-unknown"
+
+define void @test0() #0 {
+  ret void
+}
+
+define void @test1() #0 {
+  ret void
+}
+
+attributes #0 = { "wasm-async" }
+
+; CHECK:  .section.custom_section.async,"",@
+; CHECK-NEXT: .int32  test0@FUNCINDEX
+; CHECK-NEXT: .int32  test1@FUNCINDEX
Index: llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
===
--- llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
+++ llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.h
@@ -66,6 +66,7 @@
   void emitEndOfAsmFile(Module ) override;
   void EmitProducerInfo(Module );
   void EmitTargetFeatures(Module );
+  void EmitAsync(Module );
   void emitSymbolType(const MCSymbolWasm *Sym);
   void emitGlobalVariable(const GlobalVariable *GV) override;
   void emitJumpTableInfo() override;
Index: llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
===
--- llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -438,6 +438,7 @@
 
   EmitProducerInfo(M);
   EmitTargetFeatures(M);
+  EmitAsync(M);
 }
 
 void WebAssemblyAsmPrinter::EmitProducerInfo(Module ) {
@@ -556,6 +557,32 @@
   OutStreamer->popSection();
 }
 
+void WebAssemblyAsmPrinter::EmitAsync(Module ) {
+  SmallVector AsyncFuncs;
+
+  for (const auto  : M) {
+auto *Sym = cast(getSymbol());
+if (F.hasFnAttribute("wasm-async"))
+  AsyncFuncs.push_back(Sym);
+  }
+  if (AsyncFuncs.size() == 0)
+return;
+
+  MCSectionWasm *AsyncSection = OutContext.getWasmSection(
+  ".custom_section.async", SectionKind::getMetadata());
+  OutStreamer->pushSection();
+  OutStreamer->switchSection(AsyncSection);
+
+  for (auto  : AsyncFuncs) {
+OutStreamer->emitValue(
+MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_WASM_FUNCINDEX,
+OutContext),
+4);
+  }
+
+  OutStreamer->popSection();
+}
+
 void WebAssemblyAsmPrinter::emitConstantPool() {
   emitDecls(*MMI->getModule());
   assert(MF->getConstantPool()->getConstants().empty() &&
Index: llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
===
--- llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
+++ llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyWasmObjectWriter.cpp
@@ -91,6 +91,8 @@
   return wasm::R_WASM_TYPE_INDEX_LEB;
 case MCSymbolRefExpr::VK_None:
   

[PATCH] D152251: [clang][CodeGen] Fix GPU-specific attributes being dropped by bitcode linking

2023-06-06 Thread Matt Arsenault via Phabricator via cfe-commits
arsenm accepted this revision.
arsenm added inline comments.
This revision is now accepted and ready to land.



Comment at: 
clang/test/CodeGenCUDA/link-builtin-bitcode-gpu-attrs-preserved.cu:34
+// CHECK: define {{.*}} i32 @do_intrin_stuff() #[[ATTR:[0-9]+]]
+// CHECK: attributes #[[ATTR]] = {{.*}} "target-features"="+gfx11-insts"
+

arsenm wrote:
> Also should make sure target-cpu was set
Did this previously receive the target-features spam implied by the target?


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D152251/new/

https://reviews.llvm.org/D152251

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


[PATCH] D152305: [clang-format] Add the KeepEmptyLinesAtEOF option

2023-06-06 Thread Owen Pan via Phabricator via cfe-commits
owenpan created this revision.
owenpan added a reviewer: klimek.
Herald added projects: All, clang, clang-format.
Herald added a subscriber: cfe-commits.
Herald added reviewers: rymiel, HazardyKnusperkeks, MyDeveloperDay.
owenpan requested review of this revision.

Adds an option `KeepEmptyLinesAtEOF` to keep empty lines (up to 
`MaxEmptyLinesToKeep`) before EOF. This remedies the probably unintentional 
change in behavior introduced in 3d3ea84a4f8fc, which started to always remove 
empty lines before EOF.

Fixes https://github.com/llvm/llvm-project/issues/56054 and 
https://github.com/llvm/llvm-project/issues/63150.


https://reviews.llvm.org/D152305

Files:
  clang/docs/ClangFormatStyleOptions.rst
  clang/docs/ReleaseNotes.rst
  clang/include/clang/Format/Format.h
  clang/lib/Format/Format.cpp
  clang/lib/Format/UnwrappedLineFormatter.cpp
  clang/unittests/Format/ConfigParseTest.cpp
  clang/unittests/Format/FormatTest.cpp

Index: clang/unittests/Format/FormatTest.cpp
===
--- clang/unittests/Format/FormatTest.cpp
+++ clang/unittests/Format/FormatTest.cpp
@@ -25744,6 +25744,15 @@
   verifyFormat("int i;\n", "int i;", Style);
 }
 
+TEST_F(FormatTest, KeepEmptyLinesAtEOF) {
+  FormatStyle Style = getLLVMStyle();
+  Style.KeepEmptyLinesAtEOF = true;
+
+  const StringRef Code{"int i;\n\n"};
+  verifyFormat(Code, Code, Style);
+  verifyFormat(Code, "int i;\n\n\n", Style);
+}
+
 TEST_F(FormatTest, SpaceAfterUDL) {
   verifyFormat("auto c = (4s).count();");
   verifyFormat("auto x = 5s .count() == 5;");
Index: clang/unittests/Format/ConfigParseTest.cpp
===
--- clang/unittests/Format/ConfigParseTest.cpp
+++ clang/unittests/Format/ConfigParseTest.cpp
@@ -167,6 +167,7 @@
   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
   CHECK_PARSE_BOOL(InsertBraces);
   CHECK_PARSE_BOOL(InsertNewlineAtEOF);
+  CHECK_PARSE_BOOL(KeepEmptyLinesAtEOF);
   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
Index: clang/lib/Format/UnwrappedLineFormatter.cpp
===
--- clang/lib/Format/UnwrappedLineFormatter.cpp
+++ clang/lib/Format/UnwrappedLineFormatter.cpp
@@ -1513,7 +1513,9 @@
 unsigned NewlineIndent) {
   FormatToken  = *Line.First;
   if (RootToken.is(tok::eof)) {
-unsigned Newlines = std::min(RootToken.NewlinesBefore, 1u);
+unsigned Newlines =
+std::min(RootToken.NewlinesBefore,
+ Style.KeepEmptyLinesAtEOF ? Style.MaxEmptyLinesToKeep + 1 : 1);
 unsigned TokenIndent = Newlines ? NewlineIndent : 0;
 Whitespaces->replaceWhitespace(RootToken, Newlines, TokenIndent,
TokenIndent);
Index: clang/lib/Format/Format.cpp
===
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -942,6 +942,7 @@
 IO.mapOptional("JavaScriptWrapImports", Style.JavaScriptWrapImports);
 IO.mapOptional("KeepEmptyLinesAtTheStartOfBlocks",
Style.KeepEmptyLinesAtTheStartOfBlocks);
+IO.mapOptional("KeepEmptyLinesAtEOF", Style.KeepEmptyLinesAtEOF);
 IO.mapOptional("LambdaBodyIndentation", Style.LambdaBodyIndentation);
 IO.mapOptional("LineEnding", Style.LineEnding);
 IO.mapOptional("MacroBlockBegin", Style.MacroBlockBegin);
@@ -1410,6 +1411,7 @@
   /*Hex=*/0, /*HexMinDigits=*/0};
   LLVMStyle.JavaScriptQuotes = FormatStyle::JSQS_Leave;
   LLVMStyle.JavaScriptWrapImports = true;
+  LLVMStyle.KeepEmptyLinesAtEOF = false;
   LLVMStyle.KeepEmptyLinesAtTheStartOfBlocks = true;
   LLVMStyle.LambdaBodyIndentation = FormatStyle::LBI_Signature;
   LLVMStyle.LineEnding = FormatStyle::LE_DeriveLF;
Index: clang/include/clang/Format/Format.h
===
--- clang/include/clang/Format/Format.h
+++ clang/include/clang/Format/Format.h
@@ -2675,6 +2675,10 @@
   bool JavaScriptWrapImports;
   // clang-format on
 
+  /// Keep empty lines (up to ``MaxEmptyLinesToKeep``) at end of file.
+  /// \version 17
+  bool KeepEmptyLinesAtEOF;
+
   /// If true, the empty line at the start of blocks is kept.
   /// \code
   ///true:  false:
@@ -4364,6 +4368,7 @@
JavaImportGroups == R.JavaImportGroups &&
JavaScriptQuotes == R.JavaScriptQuotes &&
JavaScriptWrapImports == R.JavaScriptWrapImports &&
+   KeepEmptyLinesAtEOF == R.KeepEmptyLinesAtEOF &&
KeepEmptyLinesAtTheStartOfBlocks ==
R.KeepEmptyLinesAtTheStartOfBlocks &&
Language == R.Language &&
Index: clang/docs/ReleaseNotes.rst
===
--- clang/docs/ReleaseNotes.rst
+++ clang/docs/ReleaseNotes.rst
@@ -669,6 +669,7 @@
 - Fix all 

[PATCH] D143075: BareMetal ToolChain multilib layering

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings added inline comments.



Comment at: clang/lib/Driver/ToolChains/BareMetal.cpp:228
+
+llvm::SmallVector BareMetal::getOrderedMultilibs() const {
+  // Get multilibs in reverse order because they're ordered most-specific last.

phosek wrote:
> Can you use 
> [llvm::reverse](https://github.com/llvm/llvm-project/blob/1d8820c342560a2fbf8e1970b861193ba8137177/llvm/include/llvm/ADT/STLExtras.h#L511)
>  instead of allocating an entire new collection?
Changed to return an iterator range.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143075/new/

https://reviews.llvm.org/D143075

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


[PATCH] D143075: BareMetal ToolChain multilib layering

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings updated this revision to Diff 529021.
michaelplatings marked an inline comment as done.
michaelplatings added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143075/new/

https://reviews.llvm.org/D143075

Files:
  clang/lib/Driver/ToolChains/BareMetal.cpp
  clang/lib/Driver/ToolChains/BareMetal.h
  clang/test/Driver/baremetal-multilib.yaml

Index: clang/test/Driver/baremetal-multilib.yaml
===
--- clang/test/Driver/baremetal-multilib.yaml
+++ clang/test/Driver/baremetal-multilib.yaml
@@ -25,6 +25,23 @@
 # RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-DIRECTORY %s
 # CHECK-PRINT-MULTI-DIRECTORY: arm-none-eabi/thumb/v8-m.main/fp
 
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x c++ %s -### -o %t.out 2>&1 \
+# RUN: --target=thumbv8.1m.main-none-eabihf -fno-exceptions --sysroot= \
+# RUN:   | FileCheck -DSYSROOT=%T/baremetal_multilib --check-prefix=CHECK-LAYERED-MULTILIB %s
+# CHECK-LAYERED-MULTILIB:  "-cc1" "-triple" "thumbv8.1m.main-none-unknown-eabihf"
+# CHECK-LAYERED-MULTILIB-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/noexcept/include/c++/v1"
+# CHECK-LAYERED-MULTILIB-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/include/c++/v1"
+# CHECK-LAYERED-MULTILIB-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/noexcept/include"
+# CHECK-LAYERED-MULTILIB-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/include"
+# CHECK-LAYERED-MULTILIB-NEXT: "-L[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/noexcept/lib"
+# CHECK-LAYERED-MULTILIB-SAME: "-L[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8.1-m.main/fp/lib"
+
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -print-multi-directory 2>&1 \
+# RUN: --target=thumbv8.1m.main-none-eabihf -fno-exceptions --sysroot= \
+# RUN:   | FileCheck --check-prefix=CHECK-LAYERED-PRINT-MULTI-DIRECTORY %s
+# CHECK-LAYERED-PRINT-MULTI-DIRECTORY:  arm-none-eabi/thumb/v8.1-m.main/fp
+# CHECK-LAYERED-PRINT-MULTI-DIRECTORY-NEXT: arm-none-eabi/thumb/v8.1-m.main/fp/noexcept
+
 # RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -print-multi-lib 2>&1 \
 # RUN: --target=arm-none-eabi --sysroot= \
 # RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-LIB %s
@@ -38,6 +55,7 @@
 # CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8-m.main/fp;@-target=thumbv8m.main-none-unknown-eabihf@mfpu=fpv5-d16
 # CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/fp;@-target=thumbv8.1m.main-none-unknown-eabihf@mfpu=fp-armv8-fullfp16-sp-d16
 # CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/nofp/mve;@-target=thumbv8.1m.main-none-unknown-eabihf@march=thumbv8.1m.main+mve@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/fp/noexcept;@-target=thumbv8.1m.main-none-unknown-eabihf@mfpu=fp-armv8-fullfp16-sp-d16@fno-exceptions
 
 # RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x assembler -mexecute-only \
 # RUN: --target=arm-none-eabi --sysroot= %s -c -### 2>&1 \
@@ -107,6 +125,13 @@
 - Dir: arm-none-eabi/thumb/v8.1-m.main/nofp/mve
   Flags: [--target=thumbv8.1m.main-none-unknown-eabihf, -march=thumbv8.1m.main+mve, -mfpu=none]
 
+# A specialisation of v8.1-m.main/fp without exceptions.
+# This layers over the top of the regular v8.1-m.main/fp so it doesn't
+# need to have its own include directory or C library, thereby saving
+# disk space.
+- Dir: arm-none-eabi/thumb/v8.1-m.main/fp/noexcept
+  Flags: [--target=thumbv8.1m.main-none-unknown-eabihf, -mfpu=fp-armv8-fullfp16-sp-d16, -fno-exceptions]
+
 
 # The second section of the file is a map from auto-detected flags
 # to custom flags. The auto-detected flags can be printed out
Index: clang/lib/Driver/ToolChains/BareMetal.h
===
--- clang/lib/Driver/ToolChains/BareMetal.h
+++ clang/lib/Driver/ToolChains/BareMetal.h
@@ -71,6 +71,10 @@
   void AddLinkRuntimeLib(const llvm::opt::ArgList ,
  llvm::opt::ArgStringList ) const;
   std::string computeSysRoot() const override;
+
+private:
+  llvm::iterator_range::const_reverse_iterator>
+  getOrderedMultilibs() const;
 };
 
 } // namespace toolchains
Index: clang/lib/Driver/ToolChains/BareMetal.cpp
===
--- clang/lib/Driver/ToolChains/BareMetal.cpp
+++ clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -105,9 +105,12 @@
   findMultilibs(D, Triple, Args);
   SmallString<128> SysRoot(computeSysRoot());
   if (!SysRoot.empty()) {
-llvm::sys::path::append(SysRoot, "lib");
-getFilePaths().push_back(std::string(SysRoot));
-getLibraryPaths().push_back(std::string(SysRoot));
+for 

[PATCH] D143059: [Driver] Enable selecting multiple multilibs

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings updated this revision to Diff 529017.
michaelplatings added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143059/new/

https://reviews.llvm.org/D143059

Files:
  clang/include/clang/Driver/Multilib.h
  clang/include/clang/Driver/ToolChain.h
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/Multilib.cpp
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/BareMetal.cpp
  clang/lib/Driver/ToolChains/CSKYToolChain.cpp
  clang/lib/Driver/ToolChains/Fuchsia.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Gnu.h
  clang/lib/Driver/ToolChains/Hexagon.cpp
  clang/lib/Driver/ToolChains/Hurd.cpp
  clang/lib/Driver/ToolChains/Linux.cpp
  clang/lib/Driver/ToolChains/MipsLinux.cpp
  clang/lib/Driver/ToolChains/OHOS.cpp
  clang/lib/Driver/ToolChains/RISCVToolchain.cpp
  clang/test/Driver/fuchsia.cpp
  clang/unittests/Driver/MultilibBuilderTest.cpp
  clang/unittests/Driver/MultilibTest.cpp

Index: clang/unittests/Driver/MultilibTest.cpp
===
--- clang/unittests/Driver/MultilibTest.cpp
+++ clang/unittests/Driver/MultilibTest.cpp
@@ -154,18 +154,18 @@
   Multilib("/bar", {}, {}, {"+bar"}),
   });
   Multilib::flags_list Flags1 = {"+foo", "-bar"};
-  Multilib Selection1;
+  llvm::SmallVector Selection1;
   ASSERT_TRUE(MS.select(Flags1, Selection1))
   << "Flag set was {\"+foo\"}, but selection not found";
-  ASSERT_TRUE(Selection1.gccSuffix() == "/foo")
-  << "Selection picked " << Selection1 << " which was not expected";
+  ASSERT_TRUE(Selection1.back().gccSuffix() == "/foo")
+  << "Selection picked " << Selection1.back() << " which was not expected";
 
   Multilib::flags_list Flags2 = {"+foo", "+bar"};
-  Multilib Selection2;
+  llvm::SmallVector Selection2;
   ASSERT_TRUE(MS.select(Flags2, Selection2))
   << "Flag set was {\"+bar\"}, but selection not found";
-  ASSERT_TRUE(Selection2.gccSuffix() == "/bar")
-  << "Selection picked " << Selection2 << " which was not expected";
+  ASSERT_TRUE(Selection2.back().gccSuffix() == "/bar")
+  << "Selection picked " << Selection2.back() << " which was not expected";
 }
 
 TEST(MultilibTest, SelectMultiple) {
@@ -173,17 +173,17 @@
   Multilib("/a", {}, {}, {"x"}),
   Multilib("/b", {}, {}, {"y"}),
   });
-  std::vector Selection;
+  llvm::SmallVector Selection;
 
-  Selection = MS.select({"x"});
+  ASSERT_TRUE(MS.select({"x"}, Selection));
   ASSERT_EQ(1u, Selection.size());
   EXPECT_EQ("/a", Selection[0].gccSuffix());
 
-  Selection = MS.select({"y"});
+  ASSERT_TRUE(MS.select({"y"}, Selection));
   ASSERT_EQ(1u, Selection.size());
   EXPECT_EQ("/b", Selection[0].gccSuffix());
 
-  Selection = MS.select({"y", "x"});
+  ASSERT_TRUE(MS.select({"y", "x"}, Selection));
   ASSERT_EQ(2u, Selection.size());
   EXPECT_EQ("/a", Selection[0].gccSuffix());
   EXPECT_EQ("/b", Selection[1].gccSuffix());
@@ -357,7 +357,7 @@
 
 TEST(MultilibTest, SelectSoft) {
   MultilibSet MS;
-  Multilib Selected;
+  llvm::SmallVector Selected;
   ASSERT_TRUE(parseYaml(MS, YAML_PREAMBLE R"(
 Variants:
 - Dir: s
@@ -373,7 +373,7 @@
 
 TEST(MultilibTest, SelectSoftFP) {
   MultilibSet MS;
-  Multilib Selected;
+  llvm::SmallVector Selected;
   ASSERT_TRUE(parseYaml(MS, YAML_PREAMBLE R"(
 Variants:
 - Dir: f
@@ -388,7 +388,7 @@
   // If hard float is all that's available then select that only if compiling
   // with hard float.
   MultilibSet MS;
-  Multilib Selected;
+  llvm::SmallVector Selected;
   ASSERT_TRUE(parseYaml(MS, YAML_PREAMBLE R"(
 Variants:
 - Dir: h
@@ -401,7 +401,7 @@
 
 TEST(MultilibTest, SelectFloatABI) {
   MultilibSet MS;
-  Multilib Selected;
+  llvm::SmallVector Selected;
   ASSERT_TRUE(parseYaml(MS, YAML_PREAMBLE R"(
 Variants:
 - Dir: s
@@ -415,18 +415,18 @@
   MatchFlags: [-mfloat-abi=soft]
 )"));
   MS.select({"-mfloat-abi=soft"}, Selected);
-  EXPECT_EQ("/s", Selected.gccSuffix());
+  EXPECT_EQ("/s", Selected.back().gccSuffix());
   MS.select({"-mfloat-abi=softfp"}, Selected);
-  EXPECT_EQ("/f", Selected.gccSuffix());
+  EXPECT_EQ("/f", Selected.back().gccSuffix());
   MS.select({"-mfloat-abi=hard"}, Selected);
-  EXPECT_EQ("/h", Selected.gccSuffix());
+  EXPECT_EQ("/h", Selected.back().gccSuffix());
 }
 
 TEST(MultilibTest, SelectFloatABIReversed) {
   // If soft is specified after softfp then softfp will never be
   // selected because soft is compatible with softfp and last wins.
   MultilibSet MS;
-  Multilib Selected;
+  llvm::SmallVector Selected;
   ASSERT_TRUE(parseYaml(MS, YAML_PREAMBLE R"(
 Variants:
 - Dir: h
@@ -440,11 +440,11 @@
   MatchFlags: [-mfloat-abi=soft]
 )"));
   MS.select({"-mfloat-abi=soft"}, Selected);
-  EXPECT_EQ("/s", Selected.gccSuffix());
+  EXPECT_EQ("/s", Selected.back().gccSuffix());
   MS.select({"-mfloat-abi=softfp"}, Selected);
-  EXPECT_EQ("/s", Selected.gccSuffix());
+  EXPECT_EQ("/s", Selected.back().gccSuffix());
   

[PATCH] D142986: Enable multilib.yaml in the BareMetal ToolChain

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings added inline comments.



Comment at: clang/lib/Driver/ToolChains/BareMetal.cpp:183
-  SmallString<128> SysRootDir;
-  llvm::sys::path::append(SysRootDir, getDriver().Dir, "../lib/clang-runtimes",
-  getDriver().getTargetTriple());

phosek wrote:
> I see that this is a pre-existing behavior, but I find it a unfortunate that 
> the BareMetal driver is using its own convention. I'd prefer using 
> `../sys-root` which the existing convention used by GCC. I'm wondering if 
> this is something we can change as part of the transition to the new multilib 
> implementation?
If I remember correctly @abidh did it this way specifically to avoid 
conflicting with the contents of GCC's `sys-root` directory.



Comment at: clang/lib/Driver/ToolChains/BareMetal.cpp:184
+  SmallString<128> MultilibPath(SysRootDir);
+  llvm::sys::path::append(MultilibPath, MULTILIB_YAML_FILENAME);
+

phosek wrote:
> michaelplatings wrote:
> > phosek wrote:
> > > Rather than hardcoding the filename and the location, which is 
> > > inflexible, could we instead provide a command line option to specify the 
> > > file to use?
> > I'm not opposed to that in principle but I'd rather leave that as an option 
> > for a future change. At this point, for LLVM Embedded Toolchain for Arm our 
> > intent is that users will specify `--sysroot` if they want to use a 
> > separate set of multilibs.
> Relying on `--sysroot` is fine if you're assembling the sysroot yourself and 
> control the content, but when dealing with an existing sysroot it may not be 
> possible to add additional files in which case having the ability to specify 
> the `.yaml` file may be essential. Having an option also gives more 
> flexibility, for example I could imagine having more than one `.yaml` file 
> for the same sysroot with different subsets of multilibs.
Sounds good, let's do it in a later patch.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142986/new/

https://reviews.llvm.org/D142986

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


[PATCH] D142986: Enable multilib.yaml in the BareMetal ToolChain

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings updated this revision to Diff 529016.
michaelplatings marked an inline comment as done.
michaelplatings added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142986/new/

https://reviews.llvm.org/D142986

Files:
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/Arch/ARM.cpp
  clang/lib/Driver/ToolChains/Arch/ARM.h
  clang/lib/Driver/ToolChains/BareMetal.cpp
  clang/test/Driver/baremetal-multilib.yaml
  clang/test/Driver/baremetal.cpp
  clang/test/Driver/lit.local.cfg

Index: clang/test/Driver/lit.local.cfg
===
--- clang/test/Driver/lit.local.cfg
+++ clang/test/Driver/lit.local.cfg
@@ -19,6 +19,7 @@
 ".hip",
 ".hipi",
 ".hlsl",
+".yaml",
 ]
 config.substitutions = list(config.substitutions)
 config.substitutions.insert(
Index: clang/test/Driver/baremetal.cpp
===
--- clang/test/Driver/baremetal.cpp
+++ clang/test/Driver/baremetal.cpp
@@ -118,9 +118,9 @@
 // Verify that the bare metal driver does not include any host system paths:
 // CHECK-AARCH64-NO-HOST-INC: InstalledDir: [[INSTALLEDDIR:.+]]
 // CHECK-AARCH64-NO-HOST-INC: "-resource-dir" "[[RESOURCE:[^"]+]]"
-// CHECK-AARCH64-NO-HOST-INC-SAME: "-internal-isystem" "[[INSTALLEDDIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+}}aarch64-none-elf{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
+// CHECK-AARCH64-NO-HOST-INC-SAME: "-internal-isystem" "[[INSTALLEDDIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+[^"]*}}include{{[/\\]+}}c++{{[/\\]+}}v1"
 // CHECK-AARCH64-NO-HOST-INC-SAME: "-internal-isystem" "[[RESOURCE]]{{[/\\]+}}include"
-// CHECK-AARCH64-NO-HOST-INC-SAME: "-internal-isystem" "[[INSTALLEDDIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+}}aarch64-none-elf{{[/\\]+}}include"
+// CHECK-AARCH64-NO-HOST-INC-SAME: "-internal-isystem" "[[INSTALLEDDIR]]{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+[^"]*}}include"
 
 // RUN: %clang %s -### --target=riscv64-unknown-elf -o %t.out -L some/directory/user/asked/for \
 // RUN: --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf 2>&1 \
Index: clang/test/Driver/baremetal-multilib.yaml
===
--- /dev/null
+++ clang/test/Driver/baremetal-multilib.yaml
@@ -0,0 +1,148 @@
+# REQUIRES: shell
+# UNSUPPORTED: system-windows
+
+# RUN: rm -rf %T/baremetal_multilib
+# RUN: mkdir -p %T/baremetal_multilib/bin
+# RUN: mkdir -p %T/baremetal_multilib/lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/lib
+# RUN: touch %T/baremetal_multilib/lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/lib/libclang_rt.builtins.a
+# RUN: ln -s %clang %T/baremetal_multilib/bin/clang
+# RUN: ln -s %s %T/baremetal_multilib/lib/clang-runtimes/multilib.yaml
+
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x c++ %s -### -o %t.out 2>&1 \
+# RUN: --target=thumbv8m.main-none-eabihf --sysroot= \
+# RUN:   | FileCheck -DSYSROOT=%T/baremetal_multilib %s
+# CHECK:  "-cc1" "-triple" "thumbv8m.main-none-unknown-eabihf"
+# CHECK-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/include/c++/v1"
+# CHECK-SAME: "-internal-isystem" "[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/include"
+# CHECK-SAME: "-x" "c++" "{{.*}}baremetal-multilib.yaml"
+# CHECK-NEXT: ld{{(.exe)?}}" "{{.*}}.o" "-Bstatic"
+# CHECK-SAME: "-L[[SYSROOT]]/bin/../lib/clang-runtimes/arm-none-eabi/thumb/v8-m.main/fp/lib"
+# CHECK-SAME: "-lc" "-lm" "-lclang_rt.builtins"
+# CHECK-SAME: "-o" "{{.*}}.tmp.out"
+
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -print-multi-directory 2>&1 \
+# RUN: --target=thumbv8m.main-none-eabihf --sysroot= \
+# RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-DIRECTORY %s
+# CHECK-PRINT-MULTI-DIRECTORY: arm-none-eabi/thumb/v8-m.main/fp
+
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -print-multi-lib 2>&1 \
+# RUN: --target=arm-none-eabi --sysroot= \
+# RUN:   | FileCheck --check-prefix=CHECK-PRINT-MULTI-LIB %s
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v6-m/nofp;@-target=thumbv6m-none-unknown-eabi@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7-m/nofp;@-target=thumbv7m-none-unknown-eabi@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/nofp;@-target=thumbv7em-none-unknown-eabi@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8-m.main/nofp;@-target=thumbv8m.main-none-unknown-eabi@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v8.1-m.main/nofp/nomve;@-target=thumbv8.1m.main-none-unknown-eabi@mfpu=none
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/fpv4_sp_d16;@-target=thumbv7em-none-unknown-eabihf@mfpu=fpv4-sp-d16
+# CHECK-PRINT-MULTI-LIB: arm-none-eabi/thumb/v7e-m/fpv5_d16;@-target=thumbv7em-none-unknown-eabihf@mfpu=fpv5-d16
+# 

[PATCH] D150910: [libclang] Add CXBinaryOperatorKind and CXUnaryOperatorKind (implements 29138)

2023-06-06 Thread Aaron Ballman via Phabricator via cfe-commits
aaron.ballman added a comment.

Thank you for the additions! This should have some amount of test coverage 
added to clang/unittests/libclang/LibclangTest.cpp and a release note.




Comment at: clang/tools/libclang/CIndex.cpp:9606
+
+CXString clang_getBinaryOperatorKindSpelling(enum CXBinaryOperatorKind kind) {
+  switch (kind) {

Instead of implementing this manually, I think this should do:
```
return cxstring::createRef(BinaryOperator::getOpcodeStr(kind - 1));
```
(Similar for unary operators, may need casts to compile properly).



Comment at: clang/tools/libclang/CIndex.cpp:9683
+  if (clang_isExpression(cursor.kind)) {
+auto expr = getCursorExpr(cursor);
+

Please spell out the type.



Comment at: clang/tools/libclang/CIndex.cpp:9685-9689
+if (auto op = dyn_cast(expr))
+  return static_cast(op->getOpcode() + 1);
+
+if (auto op = dyn_cast(expr))
+  return static_cast(op->getOpcode() + 1);

Similar for unary operators.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D150910/new/

https://reviews.llvm.org/D150910

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


[PATCH] D142933: Add -print-multi-selection-flags-experimental option

2023-06-06 Thread Michael Platings via Phabricator via cfe-commits
michaelplatings updated this revision to Diff 529013.
michaelplatings added a comment.

Rebase


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142933/new/

https://reviews.llvm.org/D142933

Files:
  clang/include/clang/Driver/Options.td
  clang/include/clang/Driver/ToolChain.h
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChain.cpp
  clang/lib/Driver/ToolChains/Arch/ARM.cpp
  clang/lib/Driver/ToolChains/Arch/ARM.h
  clang/test/Driver/print-multi-selection-flags.c

Index: clang/test/Driver/print-multi-selection-flags.c
===
--- /dev/null
+++ clang/test/Driver/print-multi-selection-flags.c
@@ -0,0 +1,51 @@
+// RUN: %clang -print-multi-selection-flags-experimental --target=aarch64-linux -fc++-abi=itanium -fsanitize=address | FileCheck --check-prefix=CHECK-LINUX %s
+// CHECK-LINUX: --target=aarch64-unknown-linux
+// CHECK-LINUX: -fc++-abi=itanium
+// CHECK-LINUX: -fexceptions
+// CHECK-LINUX: -frtti
+// CHECK-LINUX: -fsanitize=address
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=aarch64-fuchsia -fsanitize=hwaddress | FileCheck --check-prefix=CHECK-FUCHSIA %s
+// CHECK-FUCHSIA: --target=aarch64-unknown-fuchsia
+// CHECK-FUCHSIA: -fsanitize=hwaddress
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=arm-none-eabi -mfloat-abi=soft -fno-exceptions -fno-rtti | FileCheck --check-prefix=CHECK-ARMV4T %s
+// CHECK-ARMV4T: --target=armv4t-none-unknown-eabi
+// CHECK-ARMV4T: -fno-exceptions
+// CHECK-ARMV4T: -fno-rtti
+// CHECK-ARMV4T: -mfloat-abi=soft
+// CHECK-ARMV4T: -mfpu=none
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=armv7em-none-eabi -mfloat-abi=softfp | FileCheck --check-prefix=CHECK-SOFTFP %s
+// CHECK-SOFTFP: --target=thumbv7em-none-unknown-eabi
+// CHECK-SOFTFP: -mfloat-abi=softfp
+// CHECK-SOFTFP: -mfpu=fpv4-sp-d16
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=arm-none-eabihf -march=armv7em -mfpu=fpv5-d16 | FileCheck --check-prefix=CHECK-HARD %s
+// CHECK-HARD: --target=thumbv7em-none-unknown-eabihf
+// CHECK-HARD: -mfloat-abi=hard
+// CHECK-HARD: -mfpu=fpv5-d16
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=arm-none-eabi -mfloat-abi=soft -march=armv8-m.main+nofp | FileCheck --check-prefix=CHECK-V8MMAIN-NOFP %s
+// CHECK-V8MMAIN-NOFP: --target=thumbv8m.main-none-unknown-eabi
+// CHECK-V8MMAIN-NOFP: -mfloat-abi=soft
+// CHECK-V8MMAIN-NOFP: -mfpu=none
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=arm-none-eabi -mfloat-abi=hard -march=armv8.1m.main+mve.fp | FileCheck --check-prefix=CHECK-MVE %s
+// CHECK-MVE: --target=thumbv8.1m.main-none-unknown-eabihf
+// CHECK-MVE: -march=thumbv8.1m.main{{.*}}+mve{{.*}}+mve.fp{{.*}}
+// CHECK-MVE: -mfloat-abi=hard
+// CHECK-MVE: -mfpu=fp-armv8-fullfp16-sp-d16
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=arm-none-eabi -march=armv8.1m.main+mve+nofp | FileCheck --check-prefix=CHECK-MVENOFP %s
+// CHECK-MVENOFP: -march=thumbv8.1m.main{{.*}}+mve{{.*}}
+// CHECK-MVENOFP-NOT: -march=thumbv8.1m.main{{.*}}+mve.fp{{.*}}
+// CHECK-MVENOFP: -mfpu=none
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=aarch64-none-elf -march=armv8-a+lse | FileCheck --check-prefix=CHECK-LSE %s
+// CHECK-LSE: -march=aarch64{{.*}}+lse{{.*}}
+
+// RUN: %clang -print-multi-selection-flags-experimental --target=aarch64-none-elf -march=armv8.5-a+sve+sve2 | FileCheck --check-prefix=CHECK-SVE2 %s
+// RUN: %clang -print-multi-selection-flags-experimental --target=aarch64-none-elf -march=armv9-a| FileCheck --check-prefix=CHECK-SVE2 %s
+// CHECK-SVE2: --target=aarch64-none-unknown-elf
+// CHECK-SVE2: -march=aarch64{{.*}}+simd{{.*}}+sve{{.*}}+sve2{{.*}}
Index: clang/lib/Driver/ToolChains/Arch/ARM.h
===
--- clang/lib/Driver/ToolChains/Arch/ARM.h
+++ clang/lib/Driver/ToolChains/Arch/ARM.h
@@ -63,9 +63,11 @@
 void getARMArchCPUFromArgs(const llvm::opt::ArgList ,
llvm::StringRef , llvm::StringRef ,
bool FromAs = false);
-void getARMTargetFeatures(const Driver , const llvm::Triple ,
-  const llvm::opt::ArgList ,
-  std::vector , bool ForAS);
+llvm::ARM::FPUKind getARMTargetFeatures(const Driver ,
+const llvm::Triple ,
+const llvm::opt::ArgList ,
+std::vector ,
+bool ForAS);
 int getARMSubArchVersionNumber(const llvm::Triple );
 bool isARMMProfile(const llvm::Triple );
 bool isARMAProfile(const llvm::Triple );
Index: clang/lib/Driver/ToolChains/Arch/ARM.cpp
===
--- clang/lib/Driver/ToolChains/Arch/ARM.cpp
+++ 

[PATCH] D151587: [clang][ConstantEmitter] have tryEmitPrivateForVarInit try ConstExprEmitter fast-path first

2023-06-06 Thread Nick Desaulniers via Phabricator via cfe-commits
nickdesaulniers added a comment.

In D151587#4399684 , @ahatanak wrote:

> Is there a github issue for this crash?

I'm not aware, but I also haven't looked.

> Is anyone looking into this?

I guess I am tangentially as it seems to be a blocker for this patch.

> The following code crashes too:
>
>   typedef union {
> unsigned int f0;
>   } Union0;
>   
>   typedef struct {
> _Atomic(Union0) f1;
>   } Struct0;
>   
>   Struct0 g = {};
>
> It looks like there is a bug here: 
> https://github.com/llvm/llvm-project/blob/main/clang/lib/AST/ExprConstant.cpp#L15066
>
> `Value` is being discarded after the call to `EvaluateAtomic`.

I have no idea if D152303  is correct, but 
PTAL. Thanks for identifying such code.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151587/new/

https://reviews.llvm.org/D151587

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


[PATCH] D152303: [ExprConstant] fix ICE from Evaluate on _Atomic structs

2023-06-06 Thread Nick Desaulniers via Phabricator via cfe-commits
nickdesaulniers created this revision.
Herald added a project: All.
nickdesaulniers requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Fixes two crashes reported by @efriedma and @ahatanak, as per
@ahatanak's analysis.

Link: https://reviews.llvm.org/D151587#4397446
Link: https://reviews.llvm.org/D151587#4399684


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D152303

Files:
  clang/lib/AST/ExprConstant.cpp
  clang/test/CodeGenCXX/atomicinit.cpp


Index: clang/test/CodeGenCXX/atomicinit.cpp
===
--- clang/test/CodeGenCXX/atomicinit.cpp
+++ clang/test/CodeGenCXX/atomicinit.cpp
@@ -8,6 +8,10 @@
 // CHECK-DAG: @_ZN7PR180978constant1bE ={{.*}} local_unnamed_addr global { 
i16, i8 } { i16 2, i8 6 }, align 4
 // CHECK-DAG: @_ZN7PR180978constant1cE ={{.*}} local_unnamed_addr global { 
i16, i8 } { i16 3, i8 6 }, align 4
 // CHECK-DAG: @_ZN7PR180978constant1yE ={{.*}} local_unnamed_addr global { { 
i16, i8 }, i32 } { { i16, i8 } { i16 4, i8 6 }, i32 5 }, align 4
+// CHECK-DAG: @_ZN7PR180978constant1zE ={{.*}} global i32 0, align 4
+// CHECK-DAG: @_ZN7PR180978constant2y2E ={{.*}} global 
%"struct.PR18097::constant::Y" zeroinitializer
+// CHECK-DAG: @_ZN7PR180978constant1gE ={{.*}} global 
%"struct.PR18097::constant::Struct0" zeroinitializer
+// CHECK-DAG: @_ZN7PR180978constantL1xE = internal {{.*}} constant { i16, i8 } 
{ i16 1, i8 6 }
 
 struct A {
   _Atomic(int) i;
@@ -102,5 +106,23 @@
   _Atomic(int) b;
 };
 Y y = { X(4), 5 };
+
+// CHECK-LABEL: define {{.*}} @__cxx_global_var_init
+// CHECK: tail call void @llvm.memcpy.p0.p0.i32(ptr{{.*}} 
@_ZN7PR180978constant2y2E, ptr{{.*}} @_ZN7PR180978constantL1xE, i32 3, i1 false)
+// CHECK: %0 = load i32, ptr @_ZN7PR180978constant1zE
+// CHECK: store i32 %0, ptr getelementptr inbounds 
(%"struct.PR18097::constant::Y", ptr @_ZN7PR180978constant2y2E, i32 0, i32 1)
+int z;
+constexpr X x{1};
+Y y2 = { x, z };
+
+typedef union {
+  unsigned int f0;
+} Union0;
+
+typedef struct {
+  _Atomic(Union0) f1;
+} Struct0;
+
+Struct0 g = {};
   }
 }
Index: clang/lib/AST/ExprConstant.cpp
===
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -15065,6 +15065,7 @@
   E, Unqual, ScopeKind::FullExpression, LV);
   if (!EvaluateAtomic(E, , Value, Info))
 return false;
+  Result = Value;
 } else {
   if (!EvaluateAtomic(E, nullptr, Result, Info))
 return false;


Index: clang/test/CodeGenCXX/atomicinit.cpp
===
--- clang/test/CodeGenCXX/atomicinit.cpp
+++ clang/test/CodeGenCXX/atomicinit.cpp
@@ -8,6 +8,10 @@
 // CHECK-DAG: @_ZN7PR180978constant1bE ={{.*}} local_unnamed_addr global { i16, i8 } { i16 2, i8 6 }, align 4
 // CHECK-DAG: @_ZN7PR180978constant1cE ={{.*}} local_unnamed_addr global { i16, i8 } { i16 3, i8 6 }, align 4
 // CHECK-DAG: @_ZN7PR180978constant1yE ={{.*}} local_unnamed_addr global { { i16, i8 }, i32 } { { i16, i8 } { i16 4, i8 6 }, i32 5 }, align 4
+// CHECK-DAG: @_ZN7PR180978constant1zE ={{.*}} global i32 0, align 4
+// CHECK-DAG: @_ZN7PR180978constant2y2E ={{.*}} global %"struct.PR18097::constant::Y" zeroinitializer
+// CHECK-DAG: @_ZN7PR180978constant1gE ={{.*}} global %"struct.PR18097::constant::Struct0" zeroinitializer
+// CHECK-DAG: @_ZN7PR180978constantL1xE = internal {{.*}} constant { i16, i8 } { i16 1, i8 6 }
 
 struct A {
   _Atomic(int) i;
@@ -102,5 +106,23 @@
   _Atomic(int) b;
 };
 Y y = { X(4), 5 };
+
+// CHECK-LABEL: define {{.*}} @__cxx_global_var_init
+// CHECK: tail call void @llvm.memcpy.p0.p0.i32(ptr{{.*}} @_ZN7PR180978constant2y2E, ptr{{.*}} @_ZN7PR180978constantL1xE, i32 3, i1 false)
+// CHECK: %0 = load i32, ptr @_ZN7PR180978constant1zE
+// CHECK: store i32 %0, ptr getelementptr inbounds (%"struct.PR18097::constant::Y", ptr @_ZN7PR180978constant2y2E, i32 0, i32 1)
+int z;
+constexpr X x{1};
+Y y2 = { x, z };
+
+typedef union {
+  unsigned int f0;
+} Union0;
+
+typedef struct {
+  _Atomic(Union0) f1;
+} Struct0;
+
+Struct0 g = {};
   }
 }
Index: clang/lib/AST/ExprConstant.cpp
===
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -15065,6 +15065,7 @@
   E, Unqual, ScopeKind::FullExpression, LV);
   if (!EvaluateAtomic(E, , Value, Info))
 return false;
+  Result = Value;
 } else {
   if (!EvaluateAtomic(E, nullptr, Result, Info))
 return false;
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[PATCH] D151753: [Clang][Sema] Do not try to analyze dependent alignment during -Wcast-align

2023-06-06 Thread serge via Phabricator via cfe-commits
serge-sans-paille added inline comments.



Comment at: clang/lib/Sema/SemaChecking.cpp:16163
+// Dependent alignment cannot be resolved -> bail out.
+if (any_of(VD->specific_attrs(),
+   [](auto *A) { return A->isAlignmentDependent(); }))

shafik wrote:
> Can't we just use `hasDependentAlignment()` which basically does this.
> 
> I am curious that we don't have to do this check in every location we use 
> `getDeclAlign`
I missed that method, thanks for point it out. I think we should be doing that 
check in the other reference in SemaChecking.cpp, but I failed to find a 
reproducer...


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D151753/new/

https://reviews.llvm.org/D151753

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


  1   2   3   >