Commit Graph

539124 Commits

Author SHA1 Message Date
Steven Wu
2c9a727ae5 [CMake] Turn on LLVM_ENABLE_BACKTRACE for Apple stage1 compiler (#141872) 2025-05-28 17:32:29 -07:00
Slava Zakharin
2426ac6865 [flang] Added noalias attribute to function arguments. (#140803)
This helps to disambiguate accesses in the caller and the callee
after LLVM inlining in some apps. I did not see any performance
changes, but this is one step towards enabling other optimizations
in the apps that I am looking at.

The definition of llvm.noalias says:
```
... indicates that memory locations accessed via pointer values based on the argument or return value are not also accessed, during the execution of the function, via pointer values not based on the argument or return value. This guarantee only holds for memory locations that are modified, by any means, during the execution of the function.
```

I believe this exactly matches Fortran rules for the dummy arguments
that are modified during their subprogram execution.

I also set llvm.noalias and llvm.nocapture on the !fir.box<> arguments,
because the corresponding descriptors cannot be captured and cannot
alias anything (not based on them) during the execution of the
subprogram.
2025-05-28 17:18:04 -07:00
Jeffrey Byrnes
c49c7ddb0b [InstCombine] Combine and->cmp->sel->or-disjoint into and->mul (#135274)
While and->cmp->sel combines into and->mul may result in worse code on
some targets, this combine should be uniformly beneficial.

Proof: https://alive2.llvm.org/ce/z/MibAcN

---------

Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
Co-authored-by: Yingwei Zheng <dtcxzyw@qq.com>
2025-05-28 17:16:56 -07:00
Andy Kaylor
2b96c14774 [CIR] Update tests for global vars (#141854)
This change updates a few tests for global variable handling to also
check classic codegen output so we can easily verify consistency between
the two and will be alerted if the classic codegen changes.

This was useful in developing forthcoming changes to global linkage
handling.
2025-05-28 17:12:03 -07:00
Teresa Johnson
49d48c32e0 [MemProf] Emit remarks when hinting allocations not needing cloning (#141859)
The context disambiguation code already emits remarks when hinting
allocations (by adding hotness attributes) during cloning. However,
we did not yet emit hints when applying the hotness attributes during
building of the metadata (during matching and again after inlining).
Add remarks when we apply the hint attributes for these
non-context-sensitive allocations.
2025-05-28 16:44:44 -07:00
S. VenkataKeerthy
ed5eb1c6c6 [NFC] Fixing typos in MLGO.rst (#141878) 2025-05-28 16:39:38 -07:00
Jon Roelofs
42c8742e0e [llvm-remarkutil] Make invalid states un-representable in the count tool (#140829)
This consolidates some of the error handling around regex arguments to
the tool, and sets up the APIs such that errors must be handled before
their usage.
2025-05-28 16:27:56 -07:00
Muzammil
893ef7ffbd [mlir][GPU] Fixes subgroup reduce lowering (#141825)
Fixes the final reduction steps which were taken from an implementation
of scan, not reduction, causing lanes earlier in the wave to have
incorrect results due to masking.

Now aligning more closely with triton implementation :
https://github.com/triton-lang/triton/pull/5019

# Hypothetical example
To provide an explanation of the issue with the current implementation,
let's take the simple example of attempting to perform a sum over 64
lanes where the initial values are as follows (first lane has value 1,
and all other lanes have value 0):
```
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```
When performing a sum reduction over these 64 lanes, in the current
implementation we perform 6 dpp instructions which in sequential order
do the following:
1) sum over clusters of 2 contiguous lanes
2) sum over clusters of 4 contiguous lanes
3) sum over clusters of 8 contiguous lanes
4) sum over an entire row
5) broadcast the result of last lane in each row to the next row and
each lane sums current value with incoming value.
5) broadcast the result of the 32nd lane to last two rows and each lane
sums current value with incoming value.

After step 4) the result for the example above looks like this:

```
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

After step 5) the result looks like this:
```
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

After step 6) the result looks like this:
```
[4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
```
Note that the correct value here is always 1, yet after the
`dpp.broadcast` ops some lanes have incorrect values. The reason is that
for these incorrect lanes, like lanes 0-15 in step 5, the
`dpp.broadcast` op doesn't provide them incoming values from other
lanes. Instead these lanes are provided either their own values, or 0
(depending on whether `bound_ctrl` is true or false) as values to sum
over, either way these values are stale and these lanes shouldn't be
used in general.

So what this means:
- For a subgroup reduce over 32 lanes (like Step 5), the correct result
is stored in lanes 16 to 31
- For a subgroup reduce over 64 lanes (like Step 6), the correct result
is stored in lanes 32 to 63.

However in the current implementation we do not specifically read the
value from one of the correct lanes when returning a final value. In
some workloads it seems without this specification, the stale value from
the first lane is returned instead.

# Actual failing test
For a specific example of how the current implementation causes issues,
take a look at the IR below which represents an additive reduction over
a dynamic dimension.
```
!matA = tensor<1x?xf16>
!matB = tensor<1xf16>
#map = affine_map<(d0, d1) -> (d0, d1)>
#map1 = affine_map<(d0, d1) -> (d0)>
func.func @only_producer_fusion_multiple_result(%arg0: !matA) -> !matB {
  %cst_1 = arith.constant 0.000000e+00 : f16
  %c2_i64 = arith.constant 2 : i64
  %0 = tensor.empty() : !matB
  %2 = linalg.fill ins(%cst_1 : f16) outs(%0 : !matB) -> !matB
  %4 = linalg.generic {indexing_maps = [#map, #map1], iterator_types = ["parallel", "reduction"]} ins(%arg0 : !matA) outs(%2 : !matB)  {
  ^bb0(%in: f16, %out: f16):
    %7 = arith.addf %in, %out : f16
    linalg.yield %7 : f16
  } -> !matB
  return %4 : !matB
}
```
When provided an input of type `tensor<1x2xf16>` and values `{0, 1}` to
perform the reduction over, the value returned is consistently 4. By the
same analysis done above, this shows that the returned value is coming
from one of these stale lanes and needs to be read instead from one of
the lanes storing the correct result.

Signed-off-by: Muzammiluddin Syed <muzasyed@amd.com>
2025-05-28 17:47:22 -05:00
Luke Lau
79ae407c95 [ConstantFolding] Fold intrinsics of scalable vectors with splatted operands (#141845)
As noted in
https://github.com/llvm/llvm-project/pull/141821#issuecomment-2917328924,
whilst we currently constant fold intrinsics of fixed-length vectors via
their scalar counterpart, we don't do the same for scalable vectors.

This handles the scalable vector case when the operands are splats.

One weird snag in ConstantVector::getSplat was that it produced a undef
if passed in poison, so this also contains a fix by checking for
PoisonValue before UndefValue.
2025-05-28 23:29:41 +01:00
Jonas Devlieghere
8199f181cd [lldb] Use if-with-initializer pattern in SBTarget (NFC) (#141284)
Use the if statement with an initializer pattern that's very common in
LLVM in SBTarget. Every time someone adds a new method to SBTarget, I
want to encourage using this pattern, but I don't because it would be
inconsistent with the rest of the file. This solves that problem by
switching over the whole file.
2025-05-28 15:11:02 -07:00
Dave Lee
1d48e5549f [lldb] Run TestFrameLanguageCommands.py only on Darwin (#141866)
Tests using ObjC do not readily run on Linux.
2025-05-28 15:08:58 -07:00
Craig Topper
12600ebe0f [RISCV] Add X0_Pair to RISCVDeadRegisterDefinitions. (#141831) 2025-05-28 14:59:28 -07:00
yonghong-song
cf56b536bf [BPF] Allow struct pointee member btf generation with annotations (#141719)
Currently, to avoid generating too much BTF types, for a struct type
like
```
  struct foo {
    int val;
    struct bar *ptr;
  };
```
if the BTF generation reaches 'struct foo', it will not generate actual
type for 'struct bar' and instead a forward decl is generated. The
'struct bar' is actual generated in BTF unless it is reached through a
non-struct pointer member.

Such a limitation forces bpf developer to hack and workaround this
problem. See [1] and [2]. For example in [1], we have
```
    struct map_value {
	struct prog_test_ref_kfunc *not_kptr;
	struct prog_test_ref_kfunc __kptr *val;
	struct node_data __kptr *node;
    };
```
The BTF type for 'struct node_data' is not generated. Note that we have
a '__kptr' annotation. Similar problem for [2] with a '__uptr'
annotation. Note that the issue in [1] has been resolved later but the
hack in [2] is still needed.

This patch relaxed the struct type (with struct pointer member) BTF
generation if the struct pointer has a btf_type_tag annotation.

[1] https://lore.kernel.org/r/20230310230743.2320707-4-davemarchevsky@fb.com
[2] https://lore.kernel.org/r/20241023234759.860539-9-martin.lau@linux.dev
2025-05-28 14:36:10 -07:00
Thurston Dang
9553514e4a [NFCI][ubsan] Precommit tests for -fsanitize-annotate-debug-info (#141814)
These tests will track progress on extending
https://github.com/llvm/llvm-project/pull/139809 from CFI to more UBSan
checks.
2025-05-28 14:12:39 -07:00
Michael Jones
3a0205ae06 [libc][NFC] Cleanup code for poll (#141802)
Ensure everything is defined inside the namespace, reduce number of
ifdefs.
2025-05-28 14:08:47 -07:00
sribee8
cfba7718d2 WCSChr Implementation (#141690)
implemented wcschr and tests

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
2025-05-28 14:08:03 -07:00
Helena Kotas
f9ae8aaff2 [DirectX] Detect resources with identical overlapping binding (#140645)
This change uses resource name during DXIL resource binding analysis to detect when two (or more) resources have identical overlapping binding.

The DXIL resource analysis just detects that there is a problem with the binding and sets the `hasOverlappingBinding` flag. Full error reporting will happen later in DXILPostOptimizationValidation pass (llvm/llvm-project#110723).
2025-05-28 14:07:51 -07:00
Hans Wennborg
f20423f496 [clang] Rename -Wdeprecated-switch-case to -Wdeprecated-declarations-switch-case (#141779)
To make it more clear that it's a subset of -Wdeprecated-declarations.

Follow-up to #138562
2025-05-28 23:03:10 +02:00
Peter Klausler
f48f844f3c [flang] Fix prescanner bug w/ empty macros in line continuation (#141274)
When processing free form source line continuation, the prescanner
treats empty keyword macros as if they were spaces or tabs. After
skipping over them, however, there's code that only works if the skipped
characters ended with an actual space or tab. If the last skipped item
was an empty keyword macro's name, the last character of that name would
end up being the first character of the continuation line. Fix.
2025-05-28 14:01:55 -07:00
Peter Klausler
145712555f [flang] Allow forward reference to non-default INTEGER dummy (#141254)
A dummy argument with an explicit INTEGER type of non-default kind can
be forward-referenced from a specification expression in many Fortran
compilers. Handle by adding type declaration statements to the initial
pass over a specification part's declaration constructs. Emit an
optional warning under -pedantic.

Fixes https://github.com/llvm/llvm-project/issues/140941.
2025-05-28 14:01:28 -07:00
Peter Klausler
a6432b971a [flang] Fix folding of SHAPE(SPREAD(source,dim,ncopies=-1)) (#141146)
The number of copies on the new dimension must be clamped via MAX(0,
ncopies) so that it is no less than zero.

Fixes https://github.com/llvm/llvm-project/issues/141119.
2025-05-28 14:01:10 -07:00
Florian Hahn
249301c779 [LoopUtils] Pass sentinel value directly to createFindLastIVRed (NFC).
Now that there is only a single FindLastIV recurrence kind, simply pass
the sentinel value instead of the full recurrence descriptor to tighten
the interface.
2025-05-28 22:00:11 +01:00
Peter Klausler
ff8288442d [flang] Fix crash in error recovery (#140768)
When a TYPE(*) dummy argument is erroneously used as a component value
in a structure constructor, semantics crashes if the structure
constructor had been initially parsed as a potential function reference.
Clean out stale typed expressions when reanalyzing the reconstructed
parse subtree to ensure that errors are caught the next time around.
2025-05-28 13:59:48 -07:00
Peter Klausler
4c6b60a639 [flang] Extension: allow char string edit descriptors in input formats (#140624)
FORMAT("J=",I3) is accepted by a few other Fortran compilers as a valid
format for input as well as for output. The character string edit
descriptor "J=" is interpreted as if it had been 2X on input, causing
two characters to be skipped over. The skipped characters don't have to
match the characters in the literal string. An optional warning is
emitted under control of the -pedantic option.
2025-05-28 13:58:22 -07:00
Andy Kaylor
b574c811e8 [CIR] Defer declarations and tentative definitions (#141700)
This change adds code to defer emitting declarations and tentative
definitions until they are referenced or trigger by a call to
CompleteTentativeDefinition. This is needed to avoid premature handling
of declarations and definitions that might not be referenced in the
current translation unit. It also avoids incorrectly adding an
initializer to external declarations.

This change also updates the way the insertion location for globals is
chosen so that all globals will be emitted together at the top of the
module. This makes no functional difference, but it is very useful for
writing sensible tests.

Some tests are modified in this change to reorder global variables so
that they can be checked in the order in which they will be emitted.
2025-05-28 13:53:30 -07:00
Charles Zablit
711a1779dc add explicit default initialization to DemangledNameInfo to remove warning (#141790)
https://github.com/llvm/llvm-project/pull/140762 introduces some
compilation warnings in `lldb/unittests/Core/MangledTest.cpp`. This
patch adds explicit default initialization to `DemangledNameInfo` to
suppress those warnings.

We only had the default initialization values to `PrefixRange` and
`SuffixRange` because they are the only _optional_ fields of the
structure.
2025-05-28 21:41:45 +01:00
Florian Hahn
0d7b34bfc1 [LoopUtils] Pass start value directly to createAnyOfReduction (NFC).
Now that there is only a single AnyOf recurrence kind, simply pass the
start value instead of the full recurrence descriptor, to tighten the
interface.
2025-05-28 21:28:02 +01:00
LLVM GN Syncbot
6efd24cc88 [gn build] Port cc6f446d38 2025-05-28 20:13:20 +00:00
Teresa Johnson
cc6f446d38 [MemProf] Add basic summary section support (#141805)
This patch adds support for a basic MemProf summary section, which is
built along with the indexed MemProf profile (e.g. when reading the raw
or YAML profiles), and serialized through the indexed profile just after
the header.

Currently only 6 fields are written, specifically the number of contexts
(total, cold, hot), and the max context size (cold, warm, hot).

To support forwards and backwards compatibility for added fields in the
indexed profile, the number of fields serialized first. The code is
written to support forwards compatibility (reading newer profiles with
additional summary fields), and comments indicate how to implement
backwards compatibility (reading older profiles with fewer summary
fields) as needed.

Support is added to print the summary as YAML comments when displaying
both the raw and indexed profiles via `llvm-profdata show`. Because they
are YAML comments, the YAML reader ignores these (the summary is always
recomputed when building the indexed profile as described above).

This necessitated moving some options and a couple of interfaces out of
Analysis/MemoryProfileInfo.cpp and into the new
ProfileData/MemProfSummary.cpp file, as we need to classify context
hotness earlier and also compute context ids to build the summary from
older indexed profiles.
2025-05-28 13:12:41 -07:00
Zequan Wu
02916a432c [lldb][Formatters] Add --pointer-match-depth option to type summary add command. (#138209)
Currently, the type `T`'s summary formatter will be matched for `T`,
`T*`, `T**` and so on. This is unexpected in many data formatters. Such
unhandled cases could cause the data formatter to crash. An example
would be the lldb's built-in data formatter for `std::optional`:
```
$ cat main.cpp
#include <optional>

int main() {
  std::optional<int> o_null;
  auto po_null = &o_null;
  auto ppo_null = &po_null;
  auto pppo_null = &ppo_null;
  return 0;
}
$ clang++ -g main.cpp && lldb -o "b 8" -o "r" -o "v pppo_null"
[lldb crash]
```

This change adds an options `--pointer-match-depth` to `type summary
add` command to allow users to specify how many layer of pointers can be
dereferenced at most when matching a summary formatter of type `T`, as
Jim suggested
[here](https://github.com/llvm/llvm-project/pull/124048/#issuecomment-2611164133).
By default, this option has value 1 which means summary formatter for
`T` could also be used for `T*` but not `T**` nor beyond. This option is
no-op when `--skip-pointers` is set as well.

I didn't add such option for `type synthetic add`, `type format add`,
`type filter add`, because it useful for those command. Instead, they
all have the pointer match depth of 1. When printing a type `T*`, lldb
never print the children of `T` even if there is a synthetic formatter
registered for `T`.
2025-05-28 16:04:24 -04:00
Ashley Coleman
cb7f4ff03c [HLSL] Add Buffer def to frontend (#141086)
Fixes #138902

Defines the `Buffer<>` type in the clang frontend. Lowering from
IR->Target Machine is already handled by other code
2025-05-28 13:58:47 -06:00
Florian Hahn
440a8adb86 [VPlan] Use VPIRFlags to manage FMFs for ComputeReductionResult (NFC).
Manage fast-math flags using VPIRFlags from VPInstruciton, in inline
with other VPInstructions. With this change, we now print the correctly
flags for ComputeReductionResult, other than that NFC.
2025-05-28 20:54:58 +01:00
Hsiangkai Wang
8fb09c8d09 [mlir][gpu] Add GPU subgroup MMA extract and insert operations (#139048)
- Introduced `gpu.subgroup_mma_extract` operation to extract values from
`!gpu.mma_matrix` by invocation and indices.
- Introduced `gpu.subgroup_mma_insert` operation to insert values into
`!gpu.mma_matrix` by invocation and indices.
- Updated the conversion patterns to SPIR-V for both extract and insert
operations.
- Added test cases to validate the new operations in the GPU to SPIR-V
conversion.

RFC:
https://discourse.llvm.org/t/rfc-add-gpu-operations-to-permute-data-in-2-loaded-mma-matrix/86148?u=hsiangkai
2025-05-28 20:40:17 +01:00
Matt Arsenault
d8235affcf AMDGPU: Add is.shared/is.private intrinsics to isBoolSGPR (#141804)
No change in the net output since these ultimately expand to setcc,
but saves a step in the DAG.
2025-05-28 21:38:48 +02:00
Matt Arsenault
9ffbc8a4ce AMDGPU: Add overflow operations to isBoolSGPR (#141803)
The particular use in the test doesn't seem to do anything for
the expanded cases (i.e. the signed add/sub or multiplies).
2025-05-28 21:35:04 +02:00
Matt Arsenault
e6bae02db3 AMDGPU: Add is_fpclass to isBoolSGPR (#141801) 2025-05-28 21:31:31 +02:00
Justin Bogner
b7bb256703 Warn on misuse of DiagnosticInfo classes that hold Twines (#137397)
This annotates the `Twine` passed to the constructors of the various
DiagnosticInfo subclasses with `[[clang::lifetimebound]]`, which causes
us to warn when we would try to print the twine after it had already
been destructed.

We also update `DiagnosticInfoUnsupported` to hold a `const Twine &`
like all of the other DiagnosticInfo classes, since this warning allows
us to clean up all of the places where it was being used incorrectly.
2025-05-28 12:26:39 -07:00
Dave Lee
e653dc9ca0 [lldb] Fix TestFrameLanguageCommands.py build (#141829)
The use of `-lobjc` resulted in this test failing to build on Linux. The
flag is not necessary, this removes the flag with the expectation it
will fix the test on Linux.
2025-05-28 12:25:49 -07:00
S. VenkataKeerthy
3581e9bb4c [NFC][IR2Vec] Refactoring for Stateless Embedding Computation (#141811)
Currently, users have to invoke two APIs: `computeEmbeddings()` followed
by getters to access the embeddings. This PR refactors the code to
reduce this *stateful* access of APIs. Users can now directly invoke
getters; Internally, getters would compute the embeddings.
2025-05-28 12:19:02 -07:00
google-yfyang
259fe01ace [bazel] Add the missing dependency for the introduced use of support/Utils.h (#141828)
#138066 adds the use of this unspecified dependency. 
This breaks bazel build. 

https://buildkite.com/llvm-project/upstream-bazel/builds/137154#01971745-cb44-4fd1-af59-ccef34c3f61e
2025-05-28 15:18:55 -04:00
Aiden Grossman
46f90165be [Github] Bump PR Code Format clang-format version (#141819)
As we have discussed in the past, we should be using the latest version.
This has not been updated in a while.
2025-05-28 12:16:01 -07:00
Akira Hatanaka
b03558080e [ItaniumMangle] Make sure class types are added to the dictionary of substitution candidates when compiling for older ABIs (#138947)
`mangleCXXRecordDecl` should add class types to the substitution
dictionary unless it is called by `mangleCXXCtorVTable` (see
https://github.com/llvm/llvm-project/pull/109970 for why that is
needed).

This fixes a mis-compile caused by
https://github.com/llvm/llvm-project/pull/132401, which started calling
`mangleCXXRecordDecl` in `CXXNameMangler::mangleType(const
MemberPointerType *T)`.

rdar://149307496
2025-05-28 11:49:40 -07:00
Matthias Braun
a4b2f4a72a Check for unsupported target options even with -Qunused-arguments (#141698)
Fix clang accidentally skipping checks for
`err_drv_unsupported_opt_for_target` when `-Qunused-arguments` was
active.
2025-05-28 11:42:47 -07:00
Sang Ik Lee
3fa65dee14 [mlir] SYCL runtime wrapper: add memcpy support. (#141647) 2025-05-28 11:33:15 -07:00
Kazu Hirata
4dbc75567d [lld] Use llvm::count_if (NFC) (#141519) 2025-05-28 11:32:58 -07:00
Ramkumar Ramachandra
4bf67cdf02 [DenseMap] Fix constness issues with lookup_or (#139247)
Also demonstrate its use in ScalarEvolution.
2025-05-28 20:32:31 +02:00
A. Jiang
4304d90f0a [libc++][lldb-dap][test] Fix CI for bootstrapping-build (#141543)
#140107 changed the default argument of `disableASLR` of related
functions from `False` to `True`. libc++ CI has been stably failing for
`TestDAP_subtleFrames.py` (in bootstrapping-build) since then. The error
message "personality set failed: Operation not permitted" seems related
to ASLR.

This PR attempts to fix the CI failure by changing the default value of
`disableASLR` in `dap_server.py` to `False`.
2025-05-28 14:30:45 -04:00
Jon Roelofs
1f1c725b68 [Matrix] Propagate shape information through all binops (#141705)
They all have vector variants, so the obvious "find and replace" does
the trick.
2025-05-28 11:20:06 -07:00
Amr Hesham
6e5f9bb693 [CIR] Allow use different Int types together in Vec Shift Op (#141111)
Update the verification of ShiftOp for Vector to allow performing shift
op between signed and unsigned integers, similar to LLVM IR

Issue https://github.com/llvm/llvm-project/issues/136487
2025-05-28 20:16:20 +02:00
Nico Weber
4a44e0014d [llvm] Define __has_warning in Compiler.h if it isn't defined
Follow-up to #141091.
2025-05-28 14:12:36 -04:00