[cfe-dev] [analyzer] Retrieving macro expansions in the plist output
Artem Dergachev via cfe-dev
cfe-dev at lists.llvm.org
Fri Aug 17 16:55:24 PDT 2018
I guess nobody did this before because plists were supposed to be used
by IDEs, and IDEs were supposed to have their own jump-to-definition
functionality (in this case, macro definition).
I don't know that much about macros and source locations, but i suspect
it should indeed be possible to obtain the expanded text by traversing
spelling and expansion locations, though probably sometimes scanning
token-by-token is inevitable. To state the obvious, there are a lot of
useful methods in the SourceManager, but it's often unobvious how to
combine them correctly :/
On 8/17/18 5:09 AM, Kristóf Umann via cfe-dev wrote:
> Hi!
>
> I'm currently trying to implement a new node in the plist output that
> would show the expansion of a macro, like this:
>
> void setToNull(int **vptr) {
> *vptr = nullptr;
> }
>
> void print(void*);
>
> #define TO_NULL(x) \
> setToNull(x)
>
> #define DOES_NOTHING(x) \
> { \
> int b; \
> b = 5; \
> } \
> print(x)
>
> #define DEREF(x) \
> DOES_NOTHING(x); \
> *x
>
> void f() {
> int *a = new int(5);
> TO_NULL(&a);
> DEREF(a) = 5;
> }
>
> For this code, two PathDiagnosticMacroPieces should be generated, and
> a message like this should be displayed:
> Expanding macro 'TO_NULL' to 'print(&a); setToNull(&a)'
> Expanding macro 'DEREF' to '{ int sajt; sajt = 5; } print(a); *a'
> I've made some progress on this issue, but here are the problems I faced.
>
> Currently, HTML file generation supports macro expansions fairly well,
> however, the code that achieves this seems to be held together by
> sheer luck:
> https://clang.llvm.org/doxygen/namespaceclang_1_1html.html#a3283736376c3e436ff65975acdb1d399
> As I understand it, the entire file is re-lexed and preprocessed,
> during which macro expansions are added to the HTML file. I attempted
> to reuse the code here without having to re-lex everything, but so far
> my efforts lead to little success. I also found that any modification
> of this code quickly leads to instabilities -- although this part of
> Clang is somewhat of a mystery to me just yet, so I'd concede to this
> being my fault.
>
> I also fear that since HTML output is not as used as other outputs,
> and could lack vigorous testing, it could be crash-prone.
>
> Do you know any way of obtaining the expansion of a macro expression
> that doesn't involve such abusement of the preprocessor? Something
> like this would be ideal:
>
> SourceLocation Loc = /* PathDiagnosticMacroPiece location */;
> Preproc.getMacroExpansionForExpression(Loc));
>
> Cheers,
> Kristóf
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180817/75d30c05/attachment.html>
More information about the cfe-dev
mailing list