Skip to content
  • Sean Callanan's avatar
    This commit changes the way LLDB executes user · 1582ee68
    Sean Callanan authored
    expressions.  
    
    Previously, ClangUserExpression assumed that if
    there was a constant result for an expression 
    then it could be determined during parsing.  In
    particular, the IRInterpreter ran while parser
    state (in particular, ClangExpressionDeclMap) 
    was present.  This approach is flawed, because
    the IRInterpreter actually is capable of using
    external variables, and hence the result might
    be different each run.  Until now, we papered
    over this flaw by re-parsing the expression each
    time we ran it.
    
    I have rewritten the IRInterpreter to be 
    completely independent of the ClangExpressionDeclMap.
    Instead of special-casing external variable lookup,
    which ties the IRInterpreter closely to LLDB,
    we now interpret the exact same IR that the JIT
    would see.  This IR assumes that materialization
    has occurred; hence the recent implementation of the
    Materializer, which does not require parser state
    (in the form of ClangExpressionDeclMap) to be 
    present.
    
    Materialization, interpretation, and dematerialization
    are now all independent of parsing.  This means that
    in theory we can parse expressions once and run them
    many times.  I have three outstanding tasks before
    shutting this down:
    
        - First, I will ensure that all of this works with
          core files.  Core files have a Process but do not
          allow allocating memory, which currently confuses
          materialization.
    
        - Second, I will make expression breakpoint 
          conditions remember their ClangUserExpression and
          re-use it.
    
        - Third, I will tear out all the redundant code
          (for example, materialization logic in
          ClangExpressionDeclMap) that is no longer used.
    
    While implementing this fix, I also found a bug in
    IRForTarget's handling of floating-point constants.  
    This should be fixed.
    
    llvm-svn: 179801
    1582ee68
Loading