1. May 21, 2024
    • Florian Mayer's avatar
      codegen test · 6e81792e
      Florian Mayer authored
      Created using spr 1.3.4
      6e81792e
    • Florian Mayer's avatar
      ir test · 63dff44c
      Florian Mayer authored
      Created using spr 1.3.4
      63dff44c
    • Craig Topper's avatar
      [𝘀𝗽𝗿] changes introduced through rebase · a6a1d64a
      Craig Topper authored
      Created using spr 1.3.4
      
      [skip ci]
      a6a1d64a
    • Craig Topper's avatar
      888e087b
    • Slava Zakharin's avatar
    • Slava Zakharin's avatar
    • Joseph Huber's avatar
      [libc] Fix constant address space on global clock · 00d7e67f
      Joseph Huber authored
      Summary:
      I did this wrong in the first version, because `extern "C"` doesn't
      imply it's extern when used directly.
      00d7e67f
    • royitaqi's avatar
      SBDebugger: Add new APIs `AddDestroyCallback` and `RemoveDestroyCallback` (#89868) · 9f627750
      royitaqi authored
      # Motivation
      
      Individual callers of `SBDebugger::SetDestroyCallback()` might think
      that they have registered their callback and expect it to be called when
      the debugger is destroyed. In reality, only the last caller survives,
      and all previous callers are forgotten, which might be a surprise to
      them. Worse, if this is called in a race condition, which callback
      survives is less predictable, which may case confusing behavior
      elsewhere.
      
      # This PR
      
      Allows multiple destroy callbacks to be registered and all called when
      the debugger is destroyed.
      
      **EDIT**: Adds two new APIs: `AddDestroyCallback()` and
      `ClearDestroyCallback()`. `SetDestroyCallback()` will first clear then
      add the given callback. Tests are added for the new APIs.
      
      ## Tests
      
      ```
      bin/llvm-lit -sv ../external/llvm-project/lldb/test/API/python_api/debugger/TestDebuggerAPI.py
      ```
      
      ## (out-dated, see comments below) Semantic change to
      `SetDestroyCallback()`
      
      ~~Currently, the method overwrites the old callback with the new one.
      With this PR, it will NOT overwrite. Instead, it will hold on to both.
      Both callbacks get called during destroy.~~
      
      ~~**Risk**: Although the documentation of `SetDestroyCallback()` (see
      [C++](https://lldb.llvm.org/cpp_reference/classlldb_1_1SBDebugger.html#afa1649d9453a376b5c95888b5a0cb4ec)
      and
      [python](https://lldb.llvm.org/python_api/lldb.SBDebugger.html#lldb.SBDebugger.SetDestroyCallback)
      
      )
      doesn't really specify the behavior, there is a risk: if existing call
      sites rely on the "overwrite" behavior, they will be surprised because
      now the old callback will get called. But as the above said, the current
      behavior of "overwrite" itself might be unintended, so I don't
      anticipate users to rely on this behavior. In short, this risk might be
      less of a problem if we correct it sooner rather than later (which is
      what this PR is trying to do).~~
      
      ## (out-dated, see comments below) Implementation
      
      ~~The implementation holds a `std::vector<std::pair<callback, baton>>`.
      When `SetDestroyCallback()` is called, callbacks and batons are appended
      to the `std::vector`. When destroy event happen, the `(callback, baton)`
      pairs are invoked FIFO. Finally, the `std::vector` is cleared.~~
      
      # (out-dated, see comments below) Alternatives considered
      
      ~~Instead of changing `SetDestroyCallback()`, a new method
      `AddDestroyCallback()` can be added, which use the same
      `std::vector<std::pair<>>` implementation. Together with
      `ClearDestroyCallback()` (see below), they will replace and deprecate
      `SetDestroyCallback()`. Meanwhile, in order to be backward compatible,
      `SetDestroyCallback()` need to be updated to clear the `std::vector` and
      then add the new callback. Pros: The end state is semantically more
      correct. Cons: More steps to take; potentially maintaining an
      "incorrect" behavior (of "overwrite").~~
      
      ~~A new method `ClearDestroyCallback()` can be added. Might be
      unnecessary at this point, because workflows which need to set then
      clear callbacks may exist but shouldn't be too common at least for now.
      Such method can be added later when needed.~~
      
      ~~The `std::vector` may bring slight performance drawback if its
      implementation doesn't handle small size efficiently. However, even if
      that's the case, this path should be very cold (only used during init
      and destroy). Such performance drawback should be negligible.~~
      
      ~~A different implementation was also considered. Instead of using
      `std::vector`, the current `m_destroy_callback` field can be kept
      unchanged. When `SetDestroyCallback()` is called, a lambda function can
      be stored into `m_destroy_callback`. This lambda function will first
      call the old callback, then the new one. This way, `std::vector` is
      avoided. However, this implementation is more complex, thus less
      readable, with not much perf to gain.~~
      
      ---------
      
      Co-authored-by: default avatarRoy Shi <royshi@meta.com>
      9f627750
    • royitaqi's avatar
      Add new Python API `SBCommandInterpreter::GetTranscript()` (#90703) · e8dc8d61
      royitaqi authored
      
      
      # Motivation
      
      Currently, the user can already get the "transcript" (for "what is the
      transcript", see `CommandInterpreter::SaveTranscript`). However, the
      only way to obtain the transcript data as a user is to first destroy the
      debugger, then read the save directory. Note that destroy-callbacks
      cannot be used, because 1\ transcript data is private to the command
      interpreter (see `CommandInterpreter.h`), and 2\ the writing of the
      transcript is *after* the invocation of destory-callbacks (see
      `Debugger::Destroy`).
      
      So basically, there is no way to obtain the transcript:
      * during the lifetime of a debugger (including the destroy-callbacks,
      which often performs logging tasks, where the transcript can be useful)
      * without relying on external storage
      
      In theory, there are other ways for user to obtain transcript data
      during a debugger's life cycle:
      * Use Python API and intercept commands and results.
      * Use CLI and record console input/output.
      
      However, such ways rely on the client's setup and are not supported
      natively by LLDB.
      
      
      # Proposal
      
      Add a new Python API `SBCommandInterpreter::GetTranscript()`.
      
      Goals:
      * It can be called at any time during the debugger's life cycle,
      including in destroy-callbacks.
      * It returns data in-memory.
      
      Structured data:
      * To make data processing easier, the return type is `SBStructuredData`.
      See comments in code for how the data is organized.
      * In the future, `SaveTranscript` can be updated to write different
      formats using such data (e.g. JSON). This is probably accompanied by a
      new setting (e.g. `interpreter.save-session-format`).
      
      # Alternatives
      
      The return type can also be `std::vector<std::pair<std::string,
      SBCommandReturnObject>>`. This will make implementation easier, without
      having to translate it to `SBStructuredData`. On the other hand,
      `SBStructuredData` can convert to JSON easily, so it's more convenient
      for user to process.
      
      # Privacy
      
      Both user commands and output/error in the transcript can contain
      privacy data. However, as mentioned, the transcript is already available
      to the user. The addition of the new API doesn't increase the level of
      risk. In fact, it _lowers_ the risk of privacy data being leaked later
      on, by avoiding writing such data to external storage.
      
      Once the user (or their code) gets the transcript, it will be their
      responsibility to make sure that any required privacy policies are
      guaranteed.
      
      # Tests
      
      ```
      bin/llvm-lit -sv ../external/llvm-project/lldb/test/API/python_api/interpreter/TestCommandInterpreterAPI.py
      ```
      
      ```
      bin/llvm-lit -sv ../external/llvm-project/lldb/test/API/commands/session/save/TestSessionSave.py
      ```
      
      ---------
      
      Co-authored-by: default avatarRoy Shi <royshi@meta.com>
      Co-authored-by: default avatarMed Ismail Bennani <ismail@bennani.ma>
      e8dc8d61
    • Craig Topper's avatar
    • Craig Topper's avatar
      [SelectionDAG] Add getVPZeroExtendInReg. NFC (#92792) · 110f6a74
      Craig Topper authored
      Use it for 2 places in LegalizeIntegerTypes that created a VP_AND.
      110f6a74
    • Florian Mayer's avatar
      comment · 79ec757b
      Florian Mayer authored
      Created using spr 1.3.4
      79ec757b
    • Javed Absar's avatar
      [MLIR][Linalg] Add more specialize patterns (#91153) · 33b78338
      Javed Absar authored
      Currently only linalg.copy is recognized when trying to specialize
      linalg.generics back to named op. This diff enables recognition of more
      generic to named op e.g. linalg.fill, elemwise unary/binary.
      33b78338
    • Aiden Grossman's avatar
      [MCA] use std::function instead of function_ref when storing (#91039) · 7ecdf620
      Aiden Grossman authored
      This patch changes uses of llvm::function_ref for std::function when
      storing the callback inside of a class. The LLVM Programmer's manual
      mentions that llvm::function_ref is not safe to store as it contains
      pointers to external memory that are not guaranteed to exist in the
      future when it is stored.
      
      This causes issues when setting callbacks inside of a class that manages
      MCA state. Passing a lambda directly to the set callback functions will
      end up causing UB/segfaults when the lambda is called as some external
      memory is now invalid. This is easy to work around (create a separate
      std::function, pass that into the function setting the callback), but
      isn't ideal.
      7ecdf620
    • Nick Desaulniers (paternity leave)'s avatar
      [libc][errno] remove mips+sparc specific errnos (#92798) · dce197ac
      Nick Desaulniers (paternity leave) authored
      These are untested and unsupported platforms. The pattern used makes sense for
      platform specific error numbers, but these are platforms we do not support.
      Excise this code.
      
      Link: #91150
      dce197ac
    • Nick Desaulniers (paternity leave)'s avatar
      [libc][setjmp] disable -ftrivial-auto-var-init=pattern for now (#92796) · 51ba7a81
      Nick Desaulniers (paternity leave) authored
      This would consistently fail for me locally, to the point where I could not run
      ninja libc-unit-tests without ninja libc_setjmp_unittests failing.
      
      Turns out that since I enabled -ftrivial-auto-var-init=pattern in
      commit 1d5c16d7 ("[libc] default enable -ftrivial-auto-var-init=pattern (#78776)")
      this has been a problem. Our x86_64 setjmp definition disabled -Wuninitialized,
      so we wound up clobbering these registers and instead backing up
      0xAAAAAAAAAAAAAAAA rather than the actual register value.
      
      The implemenation should be rewritten entirely. I've proposed three different
      ways to do so (linked below). Until we decide which way to go, at least disable
      this hardening feature for this function for now so that the unit tests go back
      to green.
      
      Link: #87837
      Link: #88054
      Link: #88157
      Fixes: #91164
      51ba7a81
    • Changpeng Fang's avatar
      [OpenCL] Fix an infinite loop in builidng AddrSpaceQualType (#92612) · 753f7e81
      Changpeng Fang authored
      In building AddrSpaceQualType
      (https://github.com/llvm/llvm-project/pull/90048), there is a bug in
      removeAddrSpaceQualType() for arrays. Arrays are weird because
      qualifiers on the element type also count as qualifiers on the type, so
      getSingleStepDesugaredType() can't remove the sugar on arrays. This
      results in an infinite loop in removeAddrSpaceQualType. To fix the
      issue, we use ASTContext::getUnqualifiedArrayType instead, which strips
      the qualifier off the element type, then reconstruct the array type.
      753f7e81
    • Spenser Bauman's avatar
      [mlir][tensor] Implement folding logic for size 0 tensor and memref ops (#90814) · 1f07bfb9
      Spenser Bauman authored
      
      
      Implement folding and rewrite logic to eliminate no-op tensor and memref
      operations. This handles two specific cases:
      
      1. tensor.insert_slice operations where the size of the inserted slice
      is known to be 0.
      2. memref.copy operations where either the source or target memrefs are
      known to be emtpy.
      
      Co-authored-by: default avatarSpenser Bauman <sabauma@fastmail>
      1f07bfb9
    • Martin Storsjö's avatar
      [libcxx] Add cast to avoid pointer casting warning on Windows (#92738) · 250c39cd
      Martin Storsjö authored
      This avoids the following build time warning, when building with the
      latest nightly Clang:
      
      warning: cast from 'FARPROC' (aka 'int (*)() __attribute__((stdcall))')
      to
      'GetSystemTimeAsFileTimePtr' (aka 'void (*)(_FILETIME *)
      __attribute__((stdcall))')
      converts to incompatible function type [-Wcast-function-type-mismatch]
      
      This warning seems to have appeared since Clang commit
      999d4f84, which restructured.
      
      The GetProcAddress function returns a `FARPROC` type, which is `int
      (WINAPI *)()`. Directly casting this to another function pointer type
      triggers this warning, but casting to a `void*` inbetween avoids this
      issue. (On Unix-like platforms, dlsym returns a `void*`, which doesn't
      exhibit this casting problem.)
      250c39cd
    • Noah Goldstein's avatar
      [ValueTracking] Recognize `X op (X != 0)` as non-zero · 22328431
      Noah Goldstein authored
      The ops supported are: `add`, `sub`, `xor`, `or`, `umax`, `uadd.sat`
      
      Proofs: https://alive2.llvm.org/ce/z/8ZMSRg
      
      The `add` case actually comes up in SPECInt, the rest are here mostly
      for completeness.
      
      Closes #88579
      22328431
    • Noah Goldstein's avatar
    • Matt Arsenault's avatar
      AMDGPU: Don't fold rootn(x, 1) to input for strictfp functions (#92595) · 3cb1fe60
      Matt Arsenault authored
      We need to insert a constrained canonicalize.
      
      Depends #92594
      3cb1fe60
    • Jeremy Kun's avatar
    • Eli Friedman's avatar
      [LangRef] Try to formalize the definition of "odr" in LLVM IR. (#92619) · c1d5cc99
      Eli Friedman authored
      The current definition is a bit fuzzy... replace it with something
      that's somewhat rigorous.
      
      For functions, the definition is pretty narrow; as a consequence of
      language-level non-determinism, it's impossible to tell whether two
      functions are equivalent, so just embrace the non-determinism. For
      constants, we're pretty strict; otherwise you end up concluding
      constants can actually change value, which is bad for alias analysis. I
      think C++ standard don't allow any non-deterministic operations in
      constants, so we should be okay there? Poison is per-byte to allow some
      ambiguity in the way padding is defined.
      c1d5cc99
    • Hugo Trachino's avatar
      [MLIR][Vector] Implement transferXXPermutationLowering as MaskableOpRewritePattern (#91987) · fdd245ad
      Hugo Trachino authored
      * Implements `TransferWritePermutationLowering`,
      `TransferReadPermutationLowering` and
      `TransferWriteNonPermutationLowering` as a MaskableOpRewritePattern.
      Allowing to exit gracefully when such use of a xferOp is inside a
      `vector::MaskOp`
      * Updates MaskableOpRewritePattern to handle MemRefs and buffer
      semantics providing empty `Value()` as a return value for
      `matchAndRewriteMaskableOp` now represents successful rewriting without
      value to replace the original op.
      
      Split of https://github.com/llvm/llvm-project/pull/90835
      fdd245ad
    • Leon Clark's avatar
      [AMDGPU] Fix error in #88512. (#92770) · e1c06c38
      Leon Clark authored
      Fixes error in GlobalISel CTLZ lowering caused by
      [#88512](https://github.com/llvm/llvm-project/pull/88512
      
      ).
      
      ---------
      
      Co-authored-by: default avatarLeon Clark <leoclark@amd.com>
      e1c06c38
    • Matt Arsenault's avatar
      CodeGen: Fix libcall names for exp10 on the various darwins (#92520) · 1eb7f055
      Matt Arsenault authored
      It's really great that we have the same information duplicated in
      TargetLibraryInfo and RuntimeLibcalls which both assume everything by
      default.
      
      Should fix issue reported after #92287
      1eb7f055
    • Chris B's avatar
      [HLSL][CMake] Cache files don't have generator vars (#92793) · 6430939b
      Chris B authored
      Doh! CMake cache scripts don't have generator variables set yet, so the
      script can't depend on the generator variables. Instead I've added a
      variable that a user can specify to enable the distribution settings.
      6430939b
    • Krystian Stasiowski's avatar
      [Clang][Sema] Do not add implicit 'const' when matching constexpr function... · e75b58cf
      Krystian Stasiowski authored
      [Clang][Sema] Do not add implicit 'const' when matching constexpr function template explicit specializations after C++14 (#92449)
      
      Clang incorrectly accepts the following when using C++14 or later:
      ```
      struct A {
        template<typename T>
        void f() const;
      
        template<>
        constexpr void f<int>();
      };
      ```
      Non-static member functions declared `constexpr` are only implicitly
      `const` in C++11. This patch makes clang reject the explicit
      specialization of `f` in language modes after C++11.
      e75b58cf
    • Kiran Chandramohan's avatar
      [Flang][OpenMP] Disable all OpenMP semantics tests on Windows (#92739) · a91d5c07
      Kiran Chandramohan authored
      Removes two XFAILed tests, the other tests are marked UNSUPPORTED only
      on windows.
      a91d5c07
    • Krystian Stasiowski's avatar
      [Clang][Sema] Diagnose current instantiation used as an incomplete base class (#92597) · acf5ad2a
      Krystian Stasiowski authored
      Consider the following:
      ```
      template<typename T>
      struct A
      {
          struct B : A { };
      };
      ```
      According to [class.derived.general] p2:
      > [...] A _class-or-decltype_ shall denote a (possibly cv-qualified)
      class type that is not an incompletely defined class; any cv-qualifiers
      are ignored. [...]
      
      Although GCC and EDG rejects this, Clang accepts it. This is incorrect,
      as `A` is incomplete within its own definition (outside of a
      complete-class context). This patch correctly diagnoses instances where
      the current instantiation is used as a base class before it is complete.
      
      Conversely, Clang erroneously rejects the following:
      ```
      template<typename T>
      struct A 
      {
          struct B;
      
          struct C : B { };
      
          struct B : C { }; // error: circular inheritance between 'C' and 'A::B'
      };
      ```
      Though it may seem like no valid specialization of this template can be
      instantiated, an explicit specialization of either member classes for an
      implicit instantiated specialization of `A` would permit the definition
      of the other member class to be instantiated, e.g.:
      ```
      template<>
      struct A<int>::B { };
      
      A<int>::C c; // ok
      ```
      So this patch also does away with this error. This means that circular
      inheritance is diagnosed during instantiation of the definition as a
      consequence of requiring the base class type to be complete (matching
      the behavior of GCC and EDG).
      acf5ad2a
    • Florian Hahn's avatar
      [LAA] Move logic to compute start and end of a pointer to helper (NFC). · bce3680f
      Florian Hahn authored
      This allows use at other places, in particular an updated version of
      https://github.com/llvm/llvm-project/pull/92307.
      bce3680f
    • Fangrui Song's avatar
      [MC] Disable MCAssembler based constant folding for DwarfDebug · 245491a9
      Fangrui Song authored
      Related to the poor performance of MCAssembler based constant folding
      (see `bool MCExpr::evaluateAsAbsolute(int64_t &Res, const MCAssembler *Asm) const` and
      `AttemptToFoldSymbolOffsetDifference`),
      commit 9500a5d0 (#91082) caused -O0 -g
      compile time regression.
      
      9500a5d0 special cased .eh_frame FDE
      emitting. This patch adds a special case to .debug_* emitting as well to
      mitigate the rest regression.
      
      The MCAssembler based constant folding strategy should be improved to
      remove the two special cases.
      245491a9
    • Aaron Ballman's avatar
      Fix test for non-Itanium ABIs. · 3591da9f
      Aaron Ballman authored
      This amends 702a2b62 to hopefully get
      the test passing for Windows again.
      3591da9f
    • Jay Foad's avatar
      [AMDGPU] Refactor int_amdgcn_mov_dpp8 patterns. NFC. (#92764) · 549fdda3
      Jay Foad authored
      I still don't see why we need to select to different Real instructions
      on different targets, but at least this is less verbose.
      549fdda3
    • Yingchi Long's avatar
      [BPF] report `Invalid usage of the XADD return value"` elegantly (#92742) · c6486633
      Yingchi Long authored
      Previously `report_fatal_error` is used for reporting something goes
      wrong in the backend, but this is confusing because `report_fatal_error`
      basically means there are something unexpected & crashed in the backend.
      
      So, turn this "crash" into an elegant error reporting. After this patch,
      clang can diagnose it:
      
          bpf-crash.c:4:30: error: Invalid usage of the XADD return value
      4 | u32 next_event_id() { return __sync_fetch_and_add(&GLOBAL_EVENT_ID,
      1); }
              |                              ^
          1 error generated.
      c6486633
    • Krystian Stasiowski's avatar
      [Clang][Sema] Don't build CXXDependentScopeMemberExprs for potentially... · fd87d765
      Krystian Stasiowski authored
      [Clang][Sema] Don't build CXXDependentScopeMemberExprs for potentially implicit class member access expressions (#92318)
      
      According to [expr.prim.id.general] p2:
      > If an _id-expression_ `E` denotes a non-static non-type member of some
      class `C` at a point where the current class is `X` and
      > - `E` is potentially evaluated or `C` is `X` or a base class of `X`,
      and
      > - `E` is not the _id-expression_ of a class member access expression,
      and
      > - if `E` is a _qualified-id_, `E` is not the un-parenthesized operand
      of the unary `&` operator,
      >
      > the _id-expression_ is transformed into a class member access
      expression using `(*this)` as the object expression.
      
      Consider the following:
      ```
      struct A
      {
          void f0();
      
          template<typename T>
          void f1();
      };
      
      template<typename T>
      struct B : T
      {
          auto g0() -> decltype(T::f0()); // ok
      
          auto g1() -> decltype(T::template f1<int>()); // error: call to non-static member function without an object argument
      };
      
      template struct B<A>;
      ```
      
      Clang incorrectly rejects the call to `f1` in the _trailing-return-type_
      of `g1`. Furthermore, the following snippet results in a crash during
      codegen:
      ```
      struct A
      {
          void f();
      };
      
      template<typename T>
      struct B : T
      {
          template<typename U>
          static void g();
          
          template<>
          void g<int>()
          {
              return T::f(); // crash here
          }
      };
      
      template struct B<A>;
      ```
      This happens because we unconditionally build a
      `CXXDependentScopeMemberExpr` (with an implicit object expression) for
      `T::f` when parsing the template definition, even though we don't know
      whether `g` is an implicit object member function yet.
      
      This patch fixes these issues by instead building
      `DependentScopeDeclRefExpr`s for such expressions, and only transforming
      them into implicit class member access expressions during instantiation.
      Since we implemented the MS "unqualified lookup into dependent bases"
      extension by building an implicit class member access (and relying on
      the first component name of the _nested-name-specifier_ to be looked up
      in the context of the object expression during instantiation), we
      instead pre-append a fake _nested-name-specifier_ that refers to the
      injected-class-name of the enclosing class. This patch also refactors
      `Sema::BuildQualifiedDeclarationNameExpr` and
      `Sema::BuildQualifiedTemplateIdExpr`, streamlining their implementation
      and removing any redundant checks.
      fd87d765
    • LLVM GN Syncbot's avatar
      [gn build] Port 4f5bc4bb · e2461053
      LLVM GN Syncbot authored
      e2461053
    • Mehdi Amini's avatar
      a0e3e763
    • David Green's avatar