Skip to content
  1. Jan 09, 2019
  2. Jan 08, 2019
  3. Jan 07, 2019
    • Benjamin Kramer's avatar
      [Sema] Fix unused variable warning in Release builds · 27429d87
      Benjamin Kramer authored
      llvm-svn: 350529
      27429d87
    • Bruno Ricci's avatar
      [AST] Store some data of CXXNewExpr as trailing objects · 9b6dfac5
      Bruno Ricci authored
      Store the optional array size expression, optional initialization expression
      and optional placement new arguments in a trailing array. Additionally store
      the range for the parenthesized type-id in a trailing object if needed since
      in the vast majority of cases the type is not parenthesized (not a single new
      expression in the translation unit of SemaDecl.cpp has a parenthesized type-id).
      
      This saves 2 pointers per CXXNewExpr in all cases, and 2 pointers + 8 bytes
      per CXXNewExpr in the common case where the type is not parenthesized.
      
      Differential Revision: https://reviews.llvm.org/D56134
      
      Reviewed By: rjmccall
      
      llvm-svn: 350527
      9b6dfac5
    • Richard Smith's avatar
      DR674, PR38883, PR40238: Qualified friend lookup should look for a · 8ce732b4
      Richard Smith authored
      template specialization if there is no matching non-template function.
      
      This exposed a couple of related bugs:
       - we would sometimes substitute into a friend template instead of a
         suitable non-friend declaration; this would now crash because we'd
         decide the specialization of the friend is a redeclaration of itself
       - ADL failed to properly handle the case where an invisible local
         extern declaration redeclares an invisible friend
      
      Both are fixed herein: in particular, we now never make invisible
      friends or local extern declarations visible to name lookup unless
      they are the only declaration of the entity. (We already mostly did
      this for local extern declarations.)
      
      llvm-svn: 350505
      8ce732b4
    • Brian Gesiak's avatar
      [SemaCXX] Fix ICE for unexpanded parameter pack · 7dda73a2
      Brian Gesiak authored
      
      
      Summary:
      The documentation for RecursiveASTVisitor::TraverseDecl states that the
      Decl being traversed may be null. In fact, this is the case when a
      CXXCatchStmt with no exception decl is traversed. Because the visitor
      for diagnosing unexpanded parameter packs does not check for null, it
      ends up crashing when it attempts to call the Decl::isParameterPack
      method on a null Decl pointer.
      
      Add a null check to prevent an ICE, and a test case that would crash
      otherwise. Also, because the test requires C++ exceptions and C++14,
      change the test parameters for the entire test file. (Alternatively, I
      thought about adding a new test file, but went with this approach for my
      own convenience.)
      
      Co-authored-by: default avatarAndreas Molzer <andreas.molzer@gmx.de>
      Co-authored-by: default avatarMara Bos <m-ou.se@m-ou.se>
      
      Reviewers: rsmith
      
      Reviewed By: rsmith
      
      Subscribers: cfe-commits
      
      Differential Revision: https://reviews.llvm.org/D56271
      
      llvm-svn: 350501
      7dda73a2
  4. Jan 04, 2019
    • Joel E. Denny's avatar
      [OpenMP] Refactor const restriction for linear · bae586fb
      Joel E. Denny authored
      As discussed in D56113, this patch refactors the implementation of the
      const restriction for linear to reuse a function introduced by D56113.
      A side effect is that, if a variable has mutable members, this
      diagnostic is now skipped, and the diagnostic for the variable not
      being an integer or pointer is reported instead.
      
      Reviewed By: ABataev
      
      Differential Revision: https://reviews.llvm.org/D56299
      
      llvm-svn: 350441
      bae586fb
    • Joel E. Denny's avatar
      [OpenMP] Refactor const restriction for reductions · d2649292
      Joel E. Denny authored
      As discussed in D56113, this patch refactors the implementation of the
      const restriction for reductions to reuse a function introduced by
      D56113.  A side effect is that diagnostics sometimes now say
      "variable" instead of "list item" when a list item is a variable.
      
      Reviewed By: ABataev
      
      Differential Revision: https://reviews.llvm.org/D56298
      
      llvm-svn: 350440
      d2649292
    • Joel E. Denny's avatar
      [OpenMP] Replace predetermined shared for const variable · e6234d14
      Joel E. Denny authored
      The following appears in OpenMP 3.1 sec. 2.9.1.1 as a predetermined
      data-sharing attribute:
      
      > Variables with const-qualified type having no mutable member are
      > shared.
      
      It does not appear in OpenmP 4.0, 4.5, or 5.0.  This patch removes the
      implementation of that attribute when the requested OpenMP version is
      greater than 3.1.
      
      One effect of that removal is that `default(none)` affects const
      variables without mutable members.
      
      Also, without this patch, if a const variable without mutable members
      was explicitly lastprivate or private, it was an error because it was
      predetermined shared.  Now, clang instead complains that it's const
      without mutable fields, which is a more intelligible diagnostic.  That
      should be fine for all of the above versions because they all have
      something like the following, which is quoted from OpenMP 5.0
      sec. 2.19.3:
      
      > A variable that is privatized must not have a const-qualified type
      > unless it is of class type with a mutable member. This restriction does
      > not apply to the firstprivate clause.
      
      reduction and linear clauses already have separate checks for const
      variables.  Future patches will merge the implementations.
      
      Reviewed By: ABataev
      
      Differential Revision: https://reviews.llvm.org/D56113
      
      llvm-svn: 350439
      e6234d14
    • Erik Pilkington's avatar
      [ObjCARC] Add an new attribute, objc_externally_retained · 1e36882b
      Erik Pilkington authored
      This attribute, called "objc_externally_retained", exposes clang's
      notion of pseudo-__strong variables in ARC. Pseudo-strong variables
      "borrow" their initializer, meaning that they don't retain/release
      it, instead assuming that someone else is keeping their value alive.
      
      If a function is annotated with this attribute, implicitly strong
      parameters of that function aren't implicitly retained/released in
      the function body, and are implicitly const. This is useful to expose
      for performance reasons, most functions don't need the extra safety
      of the retain/release, so programmers can opt out as needed.
      
      This attribute can also apply to declarations of local variables,
      with similar effect.
      
      Differential revision: https://reviews.llvm.org/D55865
      
      llvm-svn: 350422
      1e36882b
    • Aaron Ballman's avatar
      Add two new pragmas for controlling software pipelining optimizations. · 9bdf515c
      Aaron Ballman authored
      This patch adds #pragma clang loop pipeline and #pragma clang loop pipeline_initiation_interval for debugging or reducing compile time purposes. It is possible to disable SWP for concrete loops to save compilation time or to find bugs by not doing SWP to certain loops. It is possible to set value of initiation interval to concrete number to save compilation time by not doing extra pipeliner passes or to check created schedule for specific initiation interval.
      
      Patch by Alexey Lapshin.
      
      llvm-svn: 350414
      9bdf515c
    • Aaron Ballman's avatar
      Refactor the way we handle diagnosing unused expression results. · fb6deeb9
      Aaron Ballman authored
      Rather than sprinkle calls to DiagnoseUnusedExprResult() around in places where we want diagnostics, we now diagnose unused expression statements and full expressions in a more generic way when acting on the final expression statement. This results in more appropriate diagnostics for [[nodiscard]] where we were previously lacking them, such as when the body of a for loop is not a compound statement.
      
      This patch fixes PR39837.
      
      llvm-svn: 350404
      fb6deeb9
    • Erich Keane's avatar
      Prevent unreachable when checking invalid multiversion decls. · 414ff52d
      Erich Keane authored
      CPUSpecifc/CPUDispatch call resolution assumed that all declarations
      that would be passed are valid, however this was an invalid assumption.
      This patch deals with those situations by making the valid version take
      priority.  Note that the checked ordering is arbitrary, since both are
      replaced by calls to the resolver later.
      
      Change-Id: I7ff2ec88c55a721d51bc1f39ea1a1fe242b4e45f
      llvm-svn: 350398
      414ff52d
    • Anastasia Stulova's avatar
      [Basic] Extend DiagnosticEngine to store and format Qualifiers. · 4cebc9db
      Anastasia Stulova authored
       
      Qualifiers can now be streamed into the DiagnosticEngine using
      regular << operator. If Qualifiers are empty 'unqualified' will
      be printed in the diagnostic otherwise regular qual syntax is
      used.
      
      Differential Revision: https://reviews.llvm.org/D56198
      
      llvm-svn: 350386
      4cebc9db
  5. Jan 03, 2019
  6. Jan 02, 2019
  7. Dec 28, 2018
  8. Dec 22, 2018
    • Bruno Ricci's avatar
      [AST] Store the arguments of CXXConstructExpr in a trailing array · ddb8f6b8
      Bruno Ricci authored
      Store the arguments of CXXConstructExpr in a trailing array. This is very
      similar to the CallExpr case in D55771, with the exception that there is
      only one derived class (CXXTemporaryObjectExpr) and that we compute the
      offset to the trailing array instead of storing it.
      
      This saves one pointer per CXXConstructExpr and CXXTemporaryObjectExpr.
      
      Reviewed By: rjmccall
      
      Differential Revision: https://reviews.llvm.org/D56022
      
      llvm-svn: 350003
      ddb8f6b8
  9. Dec 21, 2018
  10. Dec 20, 2018
    • Erik Pilkington's avatar
      Add support for namespaces on #pragma clang attribute · 0876cae0
      Erik Pilkington authored
      Namespaces are introduced by adding an "identifier." before a
      push/pop directive. Pop directives with namespaces can only pop a
      attribute group that was pushed with the same namespace. Push and pop
      directives that don't opt into namespaces have the same semantics.
      
      This is necessary to prevent a pitfall of using multiple #pragma
      clang attribute directives spread out in a large file, particularly
      when macros are involved. It isn't easy to see which pop corripsonds
      to which push, so its easy to inadvertently pop the wrong group.
      
      Differential revision: https://reviews.llvm.org/D55628
      
      llvm-svn: 349845
      0876cae0
    • Alex Lorenz's avatar
      [ObjC] Messages to 'self' in class methods that return 'instancetype' should · f50d1aca
      Alex Lorenz authored
      use the pointer to the class as the result type of the message
      
      Prior to this commit, messages to self in class methods were treated as instance
      methods to a Class value. When these methods returned instancetype the compiler
      only saw id through the instancetype, and not the Interface *. This caused
      problems when that return value was a receiver in a message send, as the
      compiler couldn't select the right method declaration and had to rely on a
      selection from the global method pool.
      
      This commit modifies the semantics of such message sends and uses class messages
      that are dispatched to the interface that corresponds to the class that contains
      the class method. This ensures that instancetypes are correctly interpreted by
      the compiler. This change is safe under ARC (as self can't be reassigned),
      however, it also applies to MRR code as we are assuming that the user isn't
      doing anything unreasonable.
      
      rdar://20940997
      
      Differential Revision: https://reviews.llvm.org/D36790
      
      llvm-svn: 349841
      f50d1aca
    • Bruno Ricci's avatar
      [Sema] Don't try to account for the size of an incomplete type in CheckArrayAccess · ed414847
      Bruno Ricci authored
      When checking that the array access is not out-of-bounds in CheckArrayAccess
      it is possible that the type of the base expression after IgnoreParenCasts is
      incomplete, even though the type of the base expression before IgnoreParenCasts
      is complete. In this case we have no information about whether the array access
      is out-of-bounds and we should just bail-out instead. This fixes PR39746 which
      was caused by trying to obtain the size of an incomplete type.
      
      Differential Revision: https://reviews.llvm.org/D55862
      
      Reviewed By: efriedma
      
      llvm-svn: 349811
      ed414847
    • Clement Courbet's avatar
      [Sema] Better static assert diagnostics for expressions involving temporaries/casts/.... · fb2c74d9
      Clement Courbet authored
      Summary:
      Handles expressions such as:
       - `std::is_const<T>()`
       - `std::is_const<T>()()`;
       - `std::is_same(decltype(U()), V>::value`;
      
      Reviewers: aaron.ballman, Quuxplusone
      
      Subscribers: cfe-commits, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D55552
      
      llvm-svn: 349729
      fb2c74d9
  11. Dec 19, 2018
  12. Dec 18, 2018
    • Bill Wendling's avatar
      Emit ASM input in a constant context · aa77513b
      Bill Wendling authored
      Summary:
      Some ASM input constraints (e.g., "i" and "n") require immediate values. At O0,
      very few code transformations are performed. So if we cannot resolve to an
      immediate when emitting the ASM input we shouldn't delay its processing.
      
      Reviewers: rsmith, efriedma
      
      Reviewed By: efriedma
      
      Subscribers: rehana, efriedma, craig.topper, jyknight, cfe-commits
      
      Differential Revision: https://reviews.llvm.org/D55616
      
      llvm-svn: 349561
      aa77513b
    • Kelvin Li's avatar
      [OPENMP] parsing and sema support for 'close' map-type-modifier · ef57943e
      Kelvin Li authored
      A map clause with the close map-type-modifier is a hint to 
      prefer that the variables are mapped using a copy into faster 
      memory.
      
      Patch by Ahsan Saghir (saghir)
      
      Differential Revision: https://reviews.llvm.org/D55719
      
      llvm-svn: 349551
      ef57943e
    • Aaron Ballman's avatar
      Emit -Wformat properly for bit-field promotions. · 94d2d09c
      Aaron Ballman authored
      Only explicitly look through integer and floating-point promotion where the result type is actually a promotion, which is not always the case for bit-fields in C.
      
      Patch by Bevin Hansson.
      
      llvm-svn: 349497
      94d2d09c
    • JF Bastien's avatar
      Automatic variable initialization · 14daa20b
      JF Bastien authored
      Summary:
      Add an option to initialize automatic variables with either a pattern or with
      zeroes. The default is still that automatic variables are uninitialized. Also
      add attributes to request uninitialized on a per-variable basis, mainly to disable
      initialization of large stack arrays when deemed too expensive.
      
      This isn't meant to change the semantics of C and C++. Rather, it's meant to be
      a last-resort when programmers inadvertently have some undefined behavior in
      their code. This patch aims to make undefined behavior hurt less, which
      security-minded people will be very happy about. Notably, this means that
      there's no inadvertent information leak when:
      
        - The compiler re-uses stack slots, and a value is used uninitialized.
        - The compiler re-uses a register, and a value is used uninitialized.
        - Stack structs / arrays / unions with padding are copied.
      
      This patch only addresses stack and register information leaks. There's many
      more infoleaks that we could address, and much more undefined behavior that
      could be tamed. Let's keep this patch focused, and I'm happy to address related
      issues elsewhere.
      
      To keep the patch simple, only some `undef` is removed for now, see
      `replaceUndef`. The padding-related infoleaks are therefore not all gone yet.
      This will be addressed in a follow-up, mainly because addressing padding-related
      leaks should be a stand-alone option which is implied by variable
      initialization.
      
      There are three options when it comes to automatic variable initialization:
      
        0. Uninitialized
      
          This is C and C++'s default. It's not changing. Depending on code
          generation, a programmer who runs into undefined behavior by using an
          uninialized automatic variable may observe any previous value (including
          program secrets), or any value which the compiler saw fit to materialize on
          the stack or in a register (this could be to synthesize an immediate, to
          refer to code or data locations, to generate cookies, etc).
      
        1. Pattern initialization
      
          This is the recommended initialization approach. Pattern initialization's
          goal is to initialize automatic variables with values which will likely
          transform logic bugs into crashes down the line, are easily recognizable in
          a crash dump, without being values which programmers can rely on for useful
          program semantics. At the same time, pattern initialization tries to
          generate code which will optimize well. You'll find the following details in
          `patternFor`:
      
          - Integers are initialized with repeated 0xAA bytes (infinite scream).
          - Vectors of integers are also initialized with infinite scream.
          - Pointers are initialized with infinite scream on 64-bit platforms because
            it's an unmappable pointer value on architectures I'm aware of. Pointers
            are initialize to 0x000000AA (small scream) on 32-bit platforms because
            32-bit platforms don't consistently offer unmappable pages. When they do
            it's usually the zero page. As people try this out, I expect that we'll
            want to allow different platforms to customize this, let's do so later.
          - Vectors of pointers are initialized the same way pointers are.
          - Floating point values and vectors are initialized with a negative quiet
            NaN with repeated 0xFF payload (e.g. 0xffffffff and 0xffffffffffffffff).
            NaNs are nice (here, anways) because they propagate on arithmetic, making
            it more likely that entire computations become NaN when a single
            uninitialized value sneaks in.
          - Arrays are initialized to their homogeneous elements' initialization
            value, repeated. Stack-based Variable-Length Arrays (VLAs) are
            runtime-initialized to the allocated size (no effort is made for negative
            size, but zero-sized VLAs are untouched even if technically undefined).
          - Structs are initialized to their heterogeneous element's initialization
            values. Zero-size structs are initialized as 0xAA since they're allocated
            a single byte.
          - Unions are initialized using the initialization for the largest member of
            the union.
      
          Expect the values used for pattern initialization to change over time, as we
          refine heuristics (both for performance and security). The goal is truly to
          avoid injecting semantics into undefined behavior, and we should be
          comfortable changing these values when there's a worthwhile point in doing
          so.
      
          Why so much infinite scream? Repeated byte patterns tend to be easy to
          synthesize on most architectures, and otherwise memset is usually very
          efficient. For values which aren't entirely repeated byte patterns, LLVM
          will often generate code which does memset + a few stores.
      
        2. Zero initialization
      
          Zero initialize all values. This has the unfortunate side-effect of
          providing semantics to otherwise undefined behavior, programs therefore
          might start to rely on this behavior, and that's sad. However, some
          programmers believe that pattern initialization is too expensive for them,
          and data might show that they're right. The only way to make these
          programmers wrong is to offer zero-initialization as an option, figure out
          where they are right, and optimize the compiler into submission. Until the
          compiler provides acceptable performance for all security-minded code, zero
          initialization is a useful (if blunt) tool.
      
      I've been asked for a fourth initialization option: user-provided byte value.
      This might be useful, and can easily be added later.
      
      Why is an out-of band initialization mecanism desired? We could instead use
      -Wuninitialized! Indeed we could, but then we're forcing the programmer to
      provide semantics for something which doesn't actually have any (it's
      uninitialized!). It's then unclear whether `int derp = 0;` lends meaning to `0`,
      or whether it's just there to shut that warning up. It's also way easier to use
      a compiler flag than it is to manually and intelligently initialize all values
      in a program.
      
      Why not just rely on static analysis? Because it cannot reason about all dynamic
      code paths effectively, and it has false positives. It's a great tool, could get
      even better, but it's simply incapable of catching all uses of uninitialized
      values.
      
      Why not just rely on memory sanitizer? Because it's not universally available,
      has a 3x performance cost, and shouldn't be deployed in production. Again, it's
      a great tool, it'll find the dynamic uses of uninitialized variables that your
      test coverage hits, but it won't find the ones that you encounter in production.
      
      What's the performance like? Not too bad! Previous publications [0] have cited
      2.7 to 4.5% averages. We've commmitted a few patches over the last few months to
      address specific regressions, both in code size and performance. In all cases,
      the optimizations are generally useful, but variable initialization benefits
      from them a lot more than regular code does. We've got a handful of other
      optimizations in mind, but the code is in good enough shape and has found enough
      latent issues that it's a good time to get the change reviewed, checked in, and
      have others kick the tires. We'll continue reducing overheads as we try this out
      on diverse codebases.
      
      Is it a good idea? Security-minded folks think so, and apparently so does the
      Microsoft Visual Studio team [1] who say "Between 2017 and mid 2018, this
      feature would have killed 49 MSRC cases that involved uninitialized struct data
      leaking across a trust boundary. It would have also mitigated a number of bugs
      involving uninitialized struct data being used directly.". They seem to use pure
      zero initialization, and claim to have taken the overheads down to within noise.
      Don't just trust Microsoft though, here's another relevant person asking for
      this [2]. It's been proposed for GCC [3] and LLVM [4] before.
      
      What are the caveats? A few!
      
        - Variables declared in unreachable code, and used later, aren't initialized.
          This goto, Duff's device, other objectionable uses of switch. This should
          instead be a hard-error in any serious codebase.
        - Volatile stack variables are still weird. That's pre-existing, it's really
          the language's fault and this patch keeps it weird. We should deprecate
          volatile [5].
        - As noted above, padding isn't fully handled yet.
      
      I don't think these caveats make the patch untenable because they can be
      addressed separately.
      
      Should this be on by default? Maybe, in some circumstances. It's a conversation
      we can have when we've tried it out sufficiently, and we're confident that we've
      eliminated enough of the overheads that most codebases would want to opt-in.
      Let's keep our precious undefined behavior until that point in time.
      
      How do I use it:
      
        1. On the command-line:
      
          -ftrivial-auto-var-init=uninitialized (the default)
          -ftrivial-auto-var-init=pattern
          -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang
      
        2. Using an attribute:
      
          int dont_initialize_me __attribute((uninitialized));
      
        [0]: https://users.elis.ugent.be/~jsartor/researchDocs/OOPSLA2011Zero-submit.pdf
        [1]: https://twitter.com/JosephBialek/status/1062774315098112001
        [2]: https://outflux.net/slides/2018/lss/danger.pdf
        [3]: https://gcc.gnu.org/ml/gcc-patches/2014-06/msg00615.html
        [4]: https://github.com/AndroidHardeningArchive/platform_external_clang/commit/776a0955ef6686d23a82d2e6a3cbd4a6a882c31c
        [5]: http://wg21.link/p1152
      
      I've also posted an RFC to cfe-dev: http://lists.llvm.org/pipermail/cfe-dev/2018-November/060172.html
      
      <rdar://problem/39131435>
      
      Reviewers: pcc, kcc, rsmith
      
      Subscribers: JDevlieghere, jkorous, dexonsmith, cfe-commits
      
      Differential Revision: https://reviews.llvm.org/D54604
      
      llvm-svn: 349442
      14daa20b
Loading