[cfe-dev] [analyzer] Retrieving macro expansions in the plist output
George Karpenkov via cfe-dev
cfe-dev at lists.llvm.org
Fri Aug 17 17:03:31 PDT 2018
I just wanted to say that it would be really amazing if HTML output knew how to show the macros properly (I guess it might be less critical for plists, as Artem says).
This is definitely one of my top complaints about HTML reports; I’ve tried working on it at the past, but other work took priority.
> On Aug 17, 2018, at 4:55 PM, Artem Dergachev via cfe-dev <cfe-dev at lists.llvm.org> wrote:
>
> 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 <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 <mailto:cfe-dev at lists.llvm.org>
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
>
> _______________________________________________
> 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/2ab23bb4/attachment.html>
More information about the cfe-dev
mailing list