Skip to content
  1. Oct 12, 2012
    • Sean Silva's avatar
      Casting.h: Automatically handle isa<Base>(Derived). · 35dd8779
      Sean Silva authored
      Additionally, all such cases are handled with no dynamic check.
      
      All `classof()` of the form
      
          class Foo {
            [...]
            static bool classof(const Bar *) { return true; }
            [...]
          }
      
      where Foo is an ancestor of Bar are no longer necessary.
      Don't write them!
      
      Note: The exact test is `is_base_of<Foo, Bar>`, which is non-strict, so
      that Foo is considered an ancestor of itself.
      
      This leads to the following rule of thumb for LLVM-style RTTI:
      
          The argument type of `classof()` should be a strict ancestor.
      
      For more information about implementing LLVM-style RTTI, see
      docs/HowToSetUpLLVMStyleRTTI.rst
      
      llvm-svn: 165765
      35dd8779
    • Sean Silva's avatar
      Remove buggy classof(). · bead14e9
      Sean Silva authored
      This classof() is effectively saying that a MachineCodeEmitter "is-a"
      JITEmitter, but JITEmitter is in fact a descendant of
      MachineCodeEmitter, so this is not semantically correct. Consequently,
      none of the assertions that rely on these classof() actualy check
      anything.
      
      Remove the RTTI (which didn't actually check anything) and use
      static_cast<> instead.
      
      Post-Mortem Bug Analysis
      ========================
      
      Cause of the bug
      ----------------
      
      r55022 appears to be the source of the classof() and assertions removed
      by this commit. It aimed at removing some dynamic_cast<> that were
      solely in the assertions. A typical diff hunk from that commit looked
      like:
      
        -  assert(dynamic_cast<JITEmitter*>(MCE) && "Unexpected MCE?");
        -  JITEmitter *JE = static_cast<JITEmitter*>(getCodeEmitter());
        +  assert(isa<JITEmitter>(MCE) && "Unexpected MCE?");
        +  JITEmitter *JE = cast<JITEmitter>(getCodeEmitter());
      
      Hence, the source of the bug then seems to be an attempt to replace
      dynamic_cast<> with LLVM-style RTTI without properly setting up the
      class hierarchy for LLVM-style RTTI. The bug therefore appears to be
      simply a "thinko".
      
      What initially indicated the presence of the bug
      ------------------------------------------------
      
      After implementing automatic upcasting for isa<>, classof() functions of
      the form
      
        static bool classof(const Foo *) { return true; }
      
      were removed, since they only serve the purpose of optimizing
      statically-OK upcasts. A subsequent recompilation triggered a build
      failure on the isa<> tests within the removed asserts, since the
      automatic upcasting (correctly) failed to substitute this classof().
      
      Key to pinning down the root cause of the bug
      ---------------------------------------------
      
      After being alerted to the presence of the bug, some thought about the
      semantics which were being asserted by the buggy classof() revealed that
      it was incorrect.
      
      How the bug could have been prevented
      -------------------------------------
      
      This bug could have been prevented by better documentation for how to
      set up LLVM-style RTTI. This should be solved by the recently added
      documentation HowToSetUpLLVMStyleRTTI. However, this bug suggests that
      the documentation should clearly explain the contract that classof()
      must fulfill. The HowToSetUpLLVMStyleRTTI already explains this
      contract, but it is a little tucked away. A future patch will expand
      that explanation and make it more prominent.
      
      There does not appear to be a simple way to have the compiler prevent
      this bug, since fundamentally it boiled down to a spurious classof()
      where the programmer made an erroneous statement about the conversion.
      This suggests that perhaps the interface to LLVM-style RTTI of classof()
      is not the best. There is already some evidence for this, since in a
      number of places Clang has classof() forward to classofKind(Kind K)
      which evaluates the cast in terms of just the Kind. This could probably
      be generalized to simply a `static const Kind MyKind;` field in leaf
      classes and `static const Kind firstMyKind, lastMyKind;` for non-leaf
      classes, and have the rest of the work be done inside Casting.h,
      assuming that the Kind enum is laid out in a preorder traversal of the
      inheritance tree.
      
      llvm-svn: 165764
      bead14e9
    • David Blaikie's avatar
      Provide a fixit when taking the address of an unqualified member function. · c2ff8e12
      David Blaikie authored
      This only applies if the type has a name. (we could potentially do something
      crazy with decltype in C++11 to qualify members of unnamed types but that
      seems excessive)
      
      It might be nice to also suggest a fixit for "&this->i", "&foo->i",
      and "&foo.i" but those expressions produce 'bound' member functions that have
      a different AST representation & make error recovery a little trickier. Left
      as future work.
      
      llvm-svn: 165763
      c2ff8e12
    • NAKAMURA Takumi's avatar
      cdb8ef59
    • NAKAMURA Takumi's avatar
      clang/test/Index/index-module.m: Mark it as XFAIL:win32 for now. · 9bd0995f
      NAKAMURA Takumi authored
      llvm-svn: 165761
      9bd0995f
    • NAKAMURA Takumi's avatar
    • Manman Ren's avatar
      PGO: create metadata for switch only if it has more than one targets. · 97c18762
      Manman Ren authored
      When all cases of a switch statement are dead, the weights vector only has one
      element, and we will get an ssertion failure when calling createBranchWeights.
      
      llvm-svn: 165759
      97c18762
    • Chad Rosier's avatar
      Remove extra semicolon. · 959c71a6
      Chad Rosier authored
      llvm-svn: 165758
      959c71a6
    • Chad Rosier's avatar
      Remove extra semicolons. · 2b189a5b
      Chad Rosier authored
      llvm-svn: 165757
      2b189a5b
    • Greg Clayton's avatar
      <rdar://problem/12042500> · 3e672345
      Greg Clayton authored
      Fixed an issue where we would try to launch an application twice and the second failure would cover up the first.
      
      llvm-svn: 165756
      3e672345
    • Greg Clayton's avatar
      Fix build warnings. · 1698be73
      Greg Clayton authored
      llvm-svn: 165755
      1698be73
    • Sean Callanan's avatar
      Fixed the IR interaction layer to deal with a · 95769bf4
      Sean Callanan authored
      change in the LLDB target data API.
      
      llvm-svn: 165754
      95769bf4
  2. Oct 11, 2012
Loading