• Paul Chaignon's avatar
    Trace external pointers through maps · eae0acfb
    Paul Chaignon authored
    The bcc rewriter currently traces external pointers using
    ProbeVisitor in order to replace dereferences with calls to
    bpf_probe_read. It is, however, unable to trace them through maps.
    
    This commit remedy this for simple (yet common) cases. Through a
    first traversal of the Clang AST, MapVisitor looks for calls to
    update (and insert) to find maps with an external pointer as value.
    When ProbeVisitor runs, in a second time, it looks for calls to
    lookup (and lookup_or_init). If the map was registered as having an
    external pointer as value, the l-value of the lookup assignment is
    marked as being an external pointer.
    
    Two traversals of the Clang AST are needed because the update of a
    map may happen after the lookup in the AST. Therefore, the first
    traversal makes sure we inspect all updates before acting on lookups.
    To implement this two-stage traversal without parsing the AST twice,
    ProbeConsumer and BTypeConsumer now implement HandleTranslationUnit,
    which is called after a whole translation unit has been parsed.
    eae0acfb
b_frontend_action.cc 35.1 KB