[cfe-dev] Determining macros used in a function or SourceRange (using clang plugin)

Alex L via cfe-dev cfe-dev at lists.llvm.org
Mon Sep 26 15:12:59 PDT 2016


On 26 September 2016 at 14:55, Eric Bayer <ebayer at vmware.com> wrote:

> Thanks Alex,
>
> That gets me mostly there.  Pardon if that is a dumb question, but I'm not
> sure how I go from a SourceLocation to a Token.  I have not worked at all
> in the preprocessor levels before.
>

Something like this should work:

    StringRef getToken(SourceLocation BeginLoc, SourceManager &SM,
LangOptions &LangOpts) {
      const SourceLocation EndLoc = Lexer::getLocForEndOfToken(BeginLoc, 0,
SM, LangOpts);
      return Lexer::getSourceText(CharSourceRange::getTokenRange(BeginLoc,
EndLoc), SM, LangOpts);
    }



>
>
>    -Eric
>
> PS - Is there a good page somewhere that outlines how these layers hang
> together?  Just don't wanna take up time if there's docs somewhere.
>

I think that the “Clang” CFE Internals Manual (
http://clang.llvm.org/docs/InternalsManual.html) might give you some of the
information that you're looking for.

Alex


>
>
> On 9/23/2016 3:33 PM, Alex L wrote:
>
> Hi Eric,
>
> Yes, you can iterate the source range of a declaration like a function.
> But I don't think you need to, as you can iterate macro expansions and
> check if they were expanded inside the source range of the function. The
> following piece of code illustrates this approach (assuming you have a
> declaration Decl and a source manager reference SM):
>
>   SourceLocation Start = Decl->getLocStart();
>   SourceLocation End = Decl->getLocEnd();
>   for (unsigned I = 0, E = SM.local_sloc_entry_size(); I != E; ++I) {
>     const SrcMgr::SLocEntry &Entry = SM.getLocalSLocEntry(I);
>     if (Entry.isExpansion() && Entry.getExpansion().isMacroBodyExpansion())
> {
>       SourceLocation Loc = Entry.getExpansion().getExpansionLocStart();
>       if (Start < Loc && Loc < End) {
>          // This Macro expansion is inside the body of the function (Decl).
>       }
>     }
>   }
>
> You can get the name of the macro that is expanded inside a function by
> looking at the first token that's at the location 'Loc' i.e. at the
> starting location of the expansion.
>
> I hope that helps,
> Alex
>
> On 23 September 2016 at 14:20, Eric Bayer via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hi,
>>
>> I have a project that I've been working on to determine dependencies in
>> code and mock/stub them.  Mostly I'm using a recursive visitor to datamine
>> these things.  I would really like to be able to figure out what macros are
>> used in a function as well (or SourceRange would be even more helpful.)
>>  Just to be clear I'm doing this as a clang frontend plugin (currently
>> stopping at syntax check).  I know that I can capture these PPCallbacks and
>> store away their SourceLocations etc during preprocessing, but based on
>> what is done in error messages I would imagine that the information is
>> there somewhere already... I'd rather not reinvent the wheel if something
>> else will work already.
>>
>> For example:
>>
>> #define BAR "%s"
>> #define FOO(x) printf( BAR, x )
>> #define DOY 3
>> void func1() {
>>     const char *lvar="func1";
>>     FOO(lvar);
>> }
>> void func2() {
>>     printf("%d", DOY);
>> }
>>
>> What I want to be able to do is isolate func1() and determine that FOO
>> and BAR were both used and what macro they were pointing to at the time
>> they were used.  What I'm hoping is that there is way to iterate the
>> SourceRange to find where the text pieces came from (with enough info to
>> know what the macro name/definition was).  I didn't see an obvious way to
>> do this.  Then again, maybe I'm going down the wrong path and there's an
>> entirely easier direction?
>>
>> Anyhow, even some hints in the right direction would be greatly
>> appreciated.
>>
>> Thanks in advance,
>>
>>    -Eric
>>
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>> <https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_cfe-2Ddev&d=CwMFaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=JUV4JPCePpFuWnRnH3TEko8ht33mtVYPAwDFFDOf8Jo&m=gzwiz0TzfEAolcm8zjqP9fh9BmiSJ_RzO2awDH0QMsc&s=lwgwDT0RAiR562A5bU82lmnf09VyqtQCL-vRd1p16QA&e=>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160926/6ceae452/attachment-0001.html>


More information about the cfe-dev mailing list