1. Apr 30, 2024
    • Daniil Kovalev's avatar
      [PAC][lldb][Dwarf] Support `__ptrauth`-qualified types in user expressions (#84387) · 64248d7d
      Daniil Kovalev authored
      Depends on #84384 and #90329
      
      This adds support for `DW_TAG_LLVM_ptrauth_type` entries corresponding
      to explicitly signed types (e.g. free function pointers) in lldb user
      expressions. Applies PR https://github.com/apple/llvm-project/pull/8239
      
      
      from Apple's downstream and also adds tests and related code.
      
      ---------
      
      Co-authored-by: default avatarJonas Devlieghere <jonas@devlieghere.com>
      64248d7d
    • Qizhi Hu's avatar
      [Clang][Sema] Fix a bug on template partial specialization with issue on... · a413c563
      Qizhi Hu authored
      [Clang][Sema] Fix a bug on template partial specialization with issue on deduction of nontype template parameter (#90376)
      
      Fix https://github.com/llvm/llvm-project/issues/68885
      
      
      When build expression from a deduced argument whose kind is
      `Declaration` and `NTTPType`(which declared as `decltype(auto)`) is
      deduced as a reference type, `BuildExpressionFromDeclTemplateArgument`
      just create a `DeclRef`. This is incorrect while we get type from the
      expression since we can't get the original reference type from
      `DeclRef`. Creating a `SubstNonTypeTemplateParmExpr` expression and make
      the deduction correct. `Replacement` expression of
      `SubstNonTypeTemplateParmExpr` just helps the deduction and may not be
      same with the original expression.
      
      Co-authored-by: default avatarhuqizhi <836744285@qq.com>
      a413c563
    • Qizhi Hu's avatar
      [Clang][Sema] fix a bug on template partial specialization (#89862) · eaee8aa0
      Qizhi Hu authored
      attempt to fix
      https://github.com/llvm/llvm-project/issues/68885#issuecomment-1764201896
      
      
      Deduction of NTTP whose type is `decltype(auto)` would create an
      implicit cast expression to dependent type and makes the type of primary
      template definition (`InjectedClassNameSpecialization`) and its partial
      specialization different. Prevent emitting cast expression to make clang
      knows their types are identical by removing `CTAK == CTAK_Deduced` when
      the type is `decltype(auto)`.
      
      Co-authored-by: default avatarhuqizhi <836744285@qq.com>
      eaee8aa0
    • Danial Klimkin's avatar
      Fix lock guads in PipePosix.cpp (#90572) · 29dda26c
      Danial Klimkin authored
      Guard object destroyed immediately after creation without naming.
      29dda26c
    • Timm Bäder's avatar
      [clang][Interp] Handle Shifts in OpenCL correctly · 74e65eec
      Timm Bäder authored
      We need to adjust the RHS to account for the LHS bitwidth.
      74e65eec
    • Andrzej Warzyński's avatar
      [mlir][test] Add TD example for peel+vectorize (depthwise conv) (#90200) · c9d92d21
      Andrzej Warzyński authored
      Adds an example that combines loop peeling and scalable vectorisation of
      `linalg.depthwise_conv_2d_nhwc_hwc`. This is similar to
      transform-op-peel-and-vectorize.mlir and is meant to demonstrate how to
      avoid masking when vectorising using scalable vectors.
      c9d92d21
    • Johannes de Fine Licht's avatar
      [MLIR][LLVM] Have LLVM::AddressOfOp implement ConstantLike (#90481) · 92ca6fcb
      Johannes de Fine Licht authored
      For all means and purposes llvm.mlir.addressof acts like a constant, and
      should be treated as such by passes. In particular, the operation should
      be propagated rather than passed whenever possible.
      92ca6fcb
    • Johannes de Fine Licht's avatar
      [MLIR] Sprinkle extra asserts in OperationSupport.h (#90465) · 2464c1c1
      Johannes de Fine Licht authored
      Should hopefully help shave some minutes off developer debugging time in
      the future.
      2464c1c1
    • Chuanqi Xu's avatar
      [Modules] No transitive source location change (#86912) · 6c311046
      Chuanqi Xu authored
      This is part of "no transitive change" patch series, "no transitive
      source location change". I talked this with @Bigcheese in the tokyo's
      WG21 meeting.
      
      The idea comes from @jyknight posted on LLVM discourse. That for:
      
      ```
      // A.cppm
      export module A;
      ...
      
      // B.cppm
      export module B;
      import A;
      ...
      
      //--- C.cppm
      export module C;
      import C;
      ```
      
      Almost every time A.cppm changes, we need to recompile `B`. Due to we
      think the source location is significant to the semantics. But it may be
      good if we can avoid recompiling `C` if the change from `A` wouldn't
      change the BMI of B.
      
      # Motivation Example
      
      This patch only cares source locations. So let's focus on source
      location's example. We can see the full example from the attached test.
      
      ```
      //--- A.cppm
      export module A;
      export template <class T>
      struct C {
          T func() {
              return T(43);
          }
      };
      export int funcA() {
          return 43;
      }
      
      //--- A.v1.cppm
      export module A;
      
      export template <class T>
      struct C {
          T func() {
              return T(43);
          }
      };
      export int funcA() {
          return 43;
      }
      
      //--- B.cppm
      export module B;
      import A;
      
      export int funcB() {
          return funcA();
      }
      
      //--- C.cppm
      export module C;
      import A;
      export void testD() {
          C<int> c;
          c.func();
      }
      ```
      
      Here the only difference between `A.cppm` and `A.v1.cppm` is that
      `A.v1.cppm` has an additional blank line. Then the test shows that two
      BMI of `B.cppm`, one specified `-fmodule-file=A=A.pcm` and the other
      specified `-fmodule-file=A=A.v1.pcm`, should have the bit-wise same
      contents.
      
      However, it is a different story for C, since C instantiates templates
      from A, and the instantiation records the source information from module
      A, which is different from `A` and `A.v1`, so it is expected that the
      BMI `C.pcm` and `C.v1.pcm` can and should differ.
      
      # Internal perspective of status quo
      
      To fully understand the patch, we need to understand how we encodes
      source locations and how we serialize and deserialize them.
      
      For source locations, we encoded them as:
      
      ```
      |
      |
      | _____ base offset of an imported module
      |
      |
      |
      |_____ base offset of another imported module
      |
      |
      |
      |
      | ___ 0
      ```
      
      As the diagram shows, we encode the local (unloaded) source location
      from 0 to higher bits. And we allocate the space for source locations
      from the loaded modules from high bits to 0. Then the source locations
      from the loaded modules will be mapped to our source location space
      according to the allocated offset.
      
      For example, for,
      
      ```
      // a.cppm
      export module a;
      ...
      
      // b.cppm
      export module b;
      import a;
      ...
      ```
      
      Assuming the offset of a source location (let's name the location as
      `S`) in a.cppm is 45 and we will record the value `45` into the BMI
      `a.pcm`. Then in b.cppm, when we import a, the source manager will
      allocate a space for module 'a' (according to the recorded number of
      source locations) as the base offset of module 'a' in the current source
      location spaces. Let's assume the allocated base offset as 90 in this
      example. Then when we want to get the location in the current source
      location space for `S`, we can get it simply by adding `45` to `90` to
      `135`. Finally we can get the source location for `S` in module B as
      `135`.
      
      And when we want to write module `b`, we would also write the source
      location of `S` as `135` directly in the BMI. And to clarify the
      location `S` comes from module `a`, we also need to record the base
      offset of module `a`, 90 in the BMI of `b`.
      
      Then the problem comes. Since the base offset of module 'a' is computed
      by the number source locations in module 'a'. In module 'b', the
      recorded base offset of module 'a' will change every time the number of
      source locations in module 'a' increase or decrease. In other words, the
      contents of BMI of B will change every time the number of locations in
      module 'a' changes. This is pretty sensitive. Almost every change will
      change the number of locations. So this is the problem this patch want
      to solve.
      
      Let's continue with the existing design to understand what's going on.
      Another interesting case is:
      
      ```
      // c.cppm
      export module c;
      import whatever;
      import a;
      import b;
      ...
      ```
      
      In `c.cppm`, when we import `a`, we still need to allocate a base
      location offset for it, let's say the value becomes to `200` somehow.
      Then when we reach the location `S` recorded in module `b`, we need to
      translate it into the current source location space. The solution is
      quite simple, we can get it by `135 + (200 - 90) = 245`. In another
      word, the offset of a source location in current module can be computed
      as `Recorded Offset + Base Offset of the its module file - Recorded Base
      Offset`.
      
      Then we're almost done about how we handle the offset of source
      locations in serializers.
      
      # The high level design of current patch
      
      From the abstract level, what we want to do is to remove the hardcoded
      base offset of imported modules and remain the ability to calculate the
      source location in a new module unit. To achieve this, we need to be
      able to find the module file owning a source location from the encoding
      of the source location.
      
      So in this patch, for each source location, we will store the local
      offset of the location and the module file index. For the above example,
      in `b.pcm`, the source location of `S` will be recorded as `135`
      directly. And in the new design, the source location of `S` will be
      recorded as `<1, 45>`. Here `1` stands for the module file index of `a`
      in module `b`. And `45` means the offset of `S` to the base offset of
      module `a`.
      
      So the trade-off here is that, to make the BMI more independent, we need
      to record more abstract information. And I feel it is worthy. The
      recompilation problem of modules is really annoying and there are still
      people complaining this. But if we can make this (including stopping
      other changes transitively), I think this may be a killer feature for
      modules. And from @Bigcheese , this should be helpful for clang explicit
      modules too.
      
      And the benchmarking side, I tested this patch against
      https://github.com/alibaba/async_simple/tree/CXX20Modules. No
      significant change on compilation time. The size of .pcm files becomes
      to 204M from 200M. I think the trade-off is pretty fair.
      
      # Some low level details
      
      I didn't use another slot to record the module file index. I tried to
      use the higher 32 bits of the existing source location encodings to
      store that information. This design may be safe. Since we use `unsigned`
      to store source locations but we use uint64_t in serialization. And
      generally `unsigned` is 32 bit width in most platforms. So it might not
      be a safe problem. Since all the bits we used to store the module file
      index is not used before. So the new encodings may be:
      
      ```
         |-----------------------|-----------------------|
         |           A           |         B         | C |
      
        * A: 32 bit. The index of the module file in the module manager + 1. The +1
                here is necessary since we wish 0 stands for the current module file.
        * B: 31 bit. The offset of the source location to the module file containing it.
        * C: The macro bit. We rotate it to the lowest bit so that we can save some 
                space in case the index of the module file is 0.
      ```
      
      (The B and C is the existing raw encoding for source locations)
      
      Another reason to reuse the same slot of the source location is to
      reduce the impact of the patch. Since there are a lot of places assuming
      we can store and get a source location from a slot. And if I tried to
      add another slot, a lot of codes breaks. I don't feel it is worhty.
      
      Another impact of this decision is that, the existing small
      optimizations for encoding source location may be invalided. The key of
      the optimization is that we can turn large values into small values then
      we can use VBR6 format to reduce the size. But if we decided to put the
      module file index into the higher bits, then maybe it simply doesn't
      work. An example may be the `SourceLocationSequence` optimization.
      
      This will only affect the size of on-disk .pcm files. I don't expect
      this impact the speed and memory use of compilations. And seeing my
      small experiments above, I feel this trade off is worthy.
      
      # Correctness
      
      The mental model for handling source location offsets is not so complex
      and I believe we can solve it by adding module file index to each stored
      source location.
      
      For the practical side, since the source location is pretty sensitive,
      and the patch can pass all the in-tree tests and a small scale projects,
      I feel it should be correct.
      
      # Future Plans
      
      I'll continue to work on no transitive decl change and no transitive
      identifier change (if matters) to achieve the goal to stop the
      propagation of unnecessary changes. But all of this depends on this
      patch. Since, clearly, the source locations are the most sensitive
      thing.
      
      ---
      
      The release nots and documentation will be added seperately.
      6c311046
    • Kristof Beyls's avatar
      [docs] Document which online sync-ups are no longer happening (#89361) · 853344d3
      Kristof Beyls authored
      Some of the online sync-ups on our Getting Involved page seem to no
      longer be happening. Document them as no longer happening, so that
      people don't get confused when dialing in to one of these.
      853344d3
    • Orlando Cazalet-Hyams's avatar
      [RemoveDIs] Fix findDbgValues to return dbg_assign records too (#90471) · 09e7d86b
      Orlando Cazalet-Hyams authored
      In the debug intrinsic class heirachy, a dbg.assign is a (inherits from)
      dbg.value, so `findDbgValues` returns dbg.values and dbg.assigns (by
      design). That hierarchy doesn't exist for DbgRecords - fix findDbgValues
      to return dbg_assign records as well as dbg_values and add unittest.
      09e7d86b
    • Abid Qadeer's avatar
      Reapply "[flang] Improve debug info for functions." with regression fixed. (#90484) · 91a8cb78
      Abid Qadeer authored
      The original PR #90083 had to be reverted in PR #90444 as it caused one
      of the gfortran tests to fail. The issue was using `isIntOrIndex` for
      checking for integer type. It allowed index type which later caused
      assertion when calling `getIntOrFloatBitWidth`. I have now replaced it
      with `isInteger` which should fix this regression.
      91a8cb78
    • wanglei's avatar
      [LoongArch][Codegen] Add support for TLSDESC · eb148aec
      wanglei authored
      The implementation only enables when the `-enable-tlsdesc` option is
      passed and the TLS model is `dynamic`.
      
      LoongArch's GCC has the same option(-mtls-dialet=) as RISC-V.
      
      Reviewers: heiher, MaskRay, SixWeining
      
      Reviewed By: SixWeining, MaskRay
      
      Pull Request: https://github.com/llvm/llvm-project/pull/90159
      eb148aec
    • David Spickett's avatar
      [lldb][Docs] Remove more subtitles from packets doc (#90443) · ff6c0cac
      David Spickett authored
      This removes various subtitles or converts them to bold text so that the
      table of contents is less cluttered.
      
      This includes "Example", "Notes", "Priority To Implement" and
      "Response".
      ff6c0cac
    • Balázs Kéri's avatar
    • Kareem Ergawy's avatar
      [mlir][OpenMP] Extend `omp.private` with a `dealloc` region (#90456) · ce12b12d
      Kareem Ergawy authored
      Extends `omp.private` with a new region: `dealloc` where deallocation
      logic for Fortran deallocatables will be outlined (this will happen in
      later PRs).
      ce12b12d
    • Christian Sigg's avatar
      f4843acd
    • Chuanqi Xu's avatar
      [C++20] [Modules] Don't skip pragma diagnostic mappings · ec527b21
      Chuanqi Xu authored
      Close https://github.com/llvm/llvm-project/issues/75057
      
      Previously, I thought the diagnostic mappings is not meaningful with
      modules incorrectly. And this problem get revealed by another change
      recently. So this patch tried to rever the previous "optimization"
      partially.
      ec527b21
    • wanglei's avatar
      [LoongArch] Support parsing la.tls.desc pseudo instruction · 4a84d8e4
      wanglei authored
      Simultaneously implemented parsing support for the `%desc_*` modifiers.
      
      Reviewers: SixWeining, heiher, xen0n
      
      Reviewed By: xen0n, SixWeining
      
      Pull Request: https://github.com/llvm/llvm-project/pull/90158
      4a84d8e4
    • Craig Topper's avatar
      [RISCV] Add DAG combine for (vmv_s_x_vl (undef) (vmv_x_s X). (#90524) · 2524146b
      Craig Topper authored
      We can use the original vector as long as the type of X matches the
      result type of the vmv_s_x_vl.
      2524146b
    • Chuanqi Xu's avatar
      Revert "[C++20] [Modules] Don't skip pragma diagnostic mappings" · 6b961e2a
      Chuanqi Xu authored
      and "[NFC] [C++20] [Modules] Use new class CXX20ModulesGenerator to
      generate module file for C++20 modules instead of PCHGenerator"
      
      This reverts commit fb213434.
      and commit 18268ac0.
      
      It looks like there are some problems about linking the compiler
      6b961e2a
    • Pengcheng Wang's avatar
      [RISCV] Remove hasSideEffects=1 for saturating/fault-only-first instructions · 940ef968
      Pengcheng Wang authored
      Marking them as `hasSideEffects=1` stops some optimizations.
      
      According to `Target.td`:
      
      > // Does the instruction have side effects that are not captured by any
      > // operands of the instruction or other flags?
      > bit hasSideEffects = ?;
      
      It seems we don't need to set `hasSideEffects` for vleNff since we have
      modelled `vl` as an output operand.
      
      As for saturating instructions, I think that explicit Def/Use list
      is kind of side effects captured by any operands of the instruction,
      so we don't need to set `hasSideEffects` either. And I have just
      investigated AArch64's implementation, they don't set this flag and
      don't add `Def` list.
      
      These changes make optimizations like `performCombineVMergeAndVOps`
      and MachineCSE possible for these instructions.
      
      As a consequence, `copyprop.mir` can't test what we want to test in
      https://reviews.llvm.org/D155140, so we replace `vssra.vi` with a
      VCIX instruction (it has side effects).
      
      Reviewers: jacquesguan, topperc, preames, asb, lukel97
      
      Reviewed By: topperc, lukel97
      
      Pull Request: https://github.com/llvm/llvm-project/pull/90049
      940ef968
    • Chuanqi Xu's avatar
      [C++20] [Modules] Don't skip pragma diagnostic mappings · fb213434
      Chuanqi Xu authored
      Close https://github.com/llvm/llvm-project/issues/75057
      
      Previously, I thought the diagnostic mappings is not meaningful with
      modules incorrectly. And this problem get revealed by another change
      recently. So this patch tried to rever the previous "optimization"
      partially.
      fb213434
    • Craig Topper's avatar
    • Craig Topper's avatar
      [SelectionDAG][RISCV] Move VP_REDUCE* legalization to LegalizeDAG.cpp. (#90522) · 705636a1
      Craig Topper authored
      LegalizeVectorType is responsible for legalizing nodes that perform an
      operation on each element may need to scalarize.
      
      This is not true for nodes like VP_REDUCE.*, BUILD_VECTOR,
      SHUFFLE_VECTOR, EXTRACT_SUBVECTOR, etc.
      
      This patch drops any nodes with a scalar result from LegalizeVectorOps
      and handles them in LegalizeDAG instead.
      
      This required moving the reduction promotion to LegalizeDAG. I have
      removed the support integer promotion as it was incorrect for integer
      min/max reductions. Since it was untested, it was best to assert on it
      until it was really needed.
      
      There are a couple regressions that can be fixed with a small DAG
      combine which I will do as a follow up.
      705636a1
    • Chuanqi Xu's avatar
      [NFC] [C++20] [Modules] Use new class CXX20ModulesGenerator to generate module... · 18268ac0
      Chuanqi Xu authored
      [NFC] [C++20] [Modules] Use new class CXX20ModulesGenerator to generate module file for C++20 modules instead of PCHGenerator
      
      Previously we're re-using PCHGenerator to generate the module file for
      C++20 modules. But this is slighty more or less odd. This patch tries
      to use a new class 'CXX20ModulesGenerator' to generate the module file
      for C++20 modules.
      18268ac0
    • Luke Lau's avatar
    • Julian Schmidt's avatar
      [clang-tidy] fix false-negative for macros in `readability-math-missing-parentheses` (#90279) · fbe4d991
      Julian Schmidt authored
      When a binary operator is the last operand of a macro, the end location
      that is past the `BinaryOperator` will be inside the macro and therefore
      an
      invalid location to insert a `FixIt` into, which is why the check bails
      when encountering such a pattern.
      However, the end location is only required for the `FixIt` and the
      diagnostic can still be emitted, just without an attached fix.
      fbe4d991
    • Fangrui Song's avatar
      [ELF] --compress-debug-sections=zstd: replace ZSTD_c_nbWorkers parallelism... · 79095b40
      Fangrui Song authored
      [ELF] --compress-debug-sections=zstd: replace ZSTD_c_nbWorkers parallelism with multi-frame parallelism
      
      https://reviews.llvm.org/D133679 utilizes zstd's multithread API to
      create one single frame. This provides a higher compression ratio but is
      significantly slower than concatenating multiple frames.
      
      With manual parallelism, it is easier to parallelize memcpy in
      OutputSection::writeTo for parallel memcpy.
      
      In addition, as the individual allocated decompression buffers are much
      smaller, we can make a wild guess (compressed_size/4) without worrying
      about a resize (due to wrong guess) would waste memory.
      79095b40
    • Craig Topper's avatar
    • thetruestblue's avatar
      Disable test for lsan and x86_64h (#90483) · 62d65604
      thetruestblue authored
      Disable this test on x86_64h for LSan.
      
      This test is failing with malformed object only on x86_64h.
      Disabling for now. 
      
      rdar://125052424
      62d65604
    • Chuanqi Xu's avatar
      [C++20] [Modules] [Reduced BMI] Avoid force writing static declarations · 38067c50
      Chuanqi Xu authored
      within module purview
      
      Close https://github.com/llvm/llvm-project/issues/90259
      
      Technically, the static declarations shouldn't be leaked from the module
      interface, otherwise it is an illegal program according to the spec. So
      we can get rid of the static declarations from the reduced BMI
      technically. Then we can close the above issue.
      
      However, there are too many `static inline` codes in existing headers.
      So it will be a pretty big breaking change if we do this globally.
      38067c50
    • sinan's avatar
      [BOLT] Avoid reference updates for non-JT symbol operands (#88838) · 9d5411ff
      sinan authored
      Skip updating references for operands that do not directly
      refer to jump table symbols but fall within a jump table's
      address range to prevent unintended modifications.
      9d5411ff
    • Phoebe Wang's avatar
      [X86] Enable EVEX512 when host CPU has AVX512 (#90479) · b3291793
      Phoebe Wang authored
      This is used when -march=native run on an unknown CPU to old version of
      LLVM.
      b3291793
    • paperchalice's avatar
      [NewPM][CodeGen] Add `MachineFunctionAnalysis` (#88610) · 6ea0c0a2
      paperchalice authored
      In new pass system, `MachineFunction` could be an analysis result again,
      machine module pass can now fetch them from analysis manager.
      `MachineModuleInfo` no longer owns them.
      Remove `FreeMachineFunctionPass`, replaced by
      `InvalidateAnalysisPass<MachineFunctionAnalysis>`.
      
      Now `FreeMachineFunction` is replaced by
      `InvalidateAnalysisPass<MachineFunctionAnalysis>`, the workaround in
      `MachineFunctionPassManager` is no longer needed, there is no difference
      between `unittests/MIR/PassBuilderCallbacksTest.cpp` and
      `unittests/IR/PassBuilderCallbacksTest.cpp`.
      6ea0c0a2
    • Dan Liew's avatar
      [Attributes] Support Attributes being declared as supporting an experimental... · b1867e18
      Dan Liew authored
      [Attributes] Support Attributes being declared as supporting an experimental late parsing mode "extension" (#88596)
      
      This patch changes the `LateParsed` field of `Attr` in `Attr.td` to be
      an instantiation of the new `LateAttrParseKind` class. The instation can be one of the following:
      
      * `LateAttrParsingNever` - Corresponds with the false value of `LateParsed` prior to this patch (the default for an attribute).
      * `LateAttrParseStandard` - Corresponds with the true value of `LateParsed` prior to this patch.
      * `LateAttrParseExperimentalExt` - A new mode described below.
      
      `LateAttrParseExperimentalExt` is an experimental extension to
      `LateAttrParseStandard`. Essentially this allows
      `Parser::ParseGNUAttributes(...)` to distinguish between these cases:
      
      1. Only `LateAttrParseExperimentalExt` attributes should be late parsed.
      2. Both `LateAttrParseExperimentalExt` and `LateAttrParseStandard`
        attributes should be late parsed.
      
      Callers (and indirect callers) of `Parser::ParseGNUAttributes(...)`
      indicate the desired behavior by setting a flag in the
      `LateParsedAttrList` object that is passed to the function.
      
      In addition to the above, a new driver and frontend flag
      (`-fexperimental-late-parse-attributes`) with a corresponding LangOpt
      (`ExperimentalLateParseAttributes`) is added that changes how
      `LateAttrParseExperimentalExt` attributes are parsed.
      
      * When the flag is disabled (default), in cases where only
        `LateAttrParsingExperimentalOnly` late parsing is requested, the
        attribute will be parsed immediately (i.e. **NOT** late parsed). This
        allows the attribute to act just like a `LateAttrParseStandard`
        attribute when the flag is disabled.
      
      * When the flag is enabled, in cases where only
        `LateAttrParsingExperimentalOnly` late parsing is requested, the
        attribute will be late parsed.
      
      The motivation behind this change is to allow the new `counted_by`
      attribute (part of `-fbounds-safety`) to support late parsing but
      **only** when `-fexperimental-late-parse-attributes` is enabled. This
      attribute needs to support late parsing to allow it to refer to fields
      later in a struct definition (or function parameters declared later).
      However, there isn't a precedent for supporting late attribute parsing
      in C so this flag allows the new behavior to exist in Clang but not be
      on by default. This behavior was requested as part of the
      `-fbounds-safety` RFC process
      (https://discourse.llvm.org/t/rfc-enforcing-bounds-safety-in-c-fbounds-safety/70854/68).
      
      This patch doesn't introduce any uses of `LateAttrParseExperimentalExt`.
      This will be added for the `counted_by` attribute in a future patch
      (https://github.com/llvm/llvm-project/pull/87596). A consequence is the
      new behavior added in this patch is not yet testable. Hence, the lack of
      tests covering the new behavior.
      
      rdar://125400257
      b1867e18
    • Aart Bik's avatar
      [mlir][sparse] fold explicit value during sparsification (#90530) · 65ee8f10
      Aart Bik authored
      This ensures the explicit value is generated (and not a load into the
      values array). Note that actually not storing values array at all is
      still TBD, this is just the very first step.
      65ee8f10
    • Andreas Jonson's avatar
      [NFC] Remove method from FoldingSet that already existed in APInt. (#90486) · 9a1386e5
      Andreas Jonson authored
      Noticed that there already was a function in APInt that updated a
      FoldingSet so there was no need for me to add it in
      https://github.com/llvm/llvm-project/pull/84617.
      9a1386e5
    • Max Winkler's avatar
      [llvm][GlobalOpt] Remove empty atexit destructors/handlers (#88836) · ce3485a0
      Max Winkler authored
      https://godbolt.org/z/frjhqMKqc for an example.
      
      Removal of allocations due to empty `__cxa_atexit` destructor calls is
      done by the following globalopt pass.
      This pass currently does not look for `atexit` handlers generated for
      platforms that do not use `__cxa_atexit`.
      By default Win32 and AIX use `atexit`.
      
      I don't see an easy way to only remove `atexit` calls that the compiler
      generated without looking at the generated mangled name of the atexit
      handler that is being registered.
      However we can easily remove all `atexit` calls that register empty
      handlers since it is trivial to ensure the removed call still returns
      `0` which is the value for success.
      ce3485a0
    • Kevin Frei's avatar
      Clean up the GSym error aggregation code, and pass the aggregator by reference (#89688) · 6566ffdf
      Kevin Frei authored
      
      
      There was a problem with `llvm-gsymutil`s error aggregation code not
      properly collecting aggregate errors. The was that the output aggregator
      collecting errors from other threads wasn't being passed by reference,
      so it was merging them into a copy of the app-wide output aggregator.
      
      While I was at it, I added a better comment above the "Merge" code and
      made it a bit more efficient, after learning more details about
      `emplace` vs. `insert` or `operator[]` on `std::map`'s.
      
      Co-authored-by: default avatarKevin Frei <freik@meta.com>
      6566ffdf