[cfe-dev] Clang, macros and declarations

George Kastrinis george.kastrinis at logicblox.com
Wed Aug 14 08:36:31 PDT 2013


Thanks. Yeah, SourceManager::getImmediateMacroCallerLoc is what we though
might help to get all the expansion stack and I think it helped in some
cases. But now we have the following issue (again from the same math
header!). Say you have in file a.cpp

#define __THROW throw ()

#define __MATHCALL(function, args) \
  __MATHDECL (double,function, args)
#define __MATHDECL(type, function, args) \
  __MATHDECL_1(type, function, args); \
  __MATHDECL_1(type, __ ## function, args)
#define __MATHDECL_1(type, function, args) \
  extern type __MATH_PRECNAME(function) args __THROW

#define __MATH_PRECNAME(name) name
#include "b.h"
#undef __MATH_PRECNAME

#define __MATH_PRECNAME(name) name##f
#include "b.h"
#undef __MATH_PRECNAME

and in b.h

__MATHCALL (cpow, (double __x, double __y));

This will create 4 functions (cpow, __cpow, cpowf, __cpowf).
Using SourceManager::getImmediateMacroCallerLoc we are able to
differentiate for example cpow and __cpow. But there is still an issue with
cpow and cpowf (and with __cpow and __cpowf). Those pairs have the same
locations even when getting the whole expansion macro.

Is there anything we can do to handle this case?



On Tue, Aug 13, 2013 at 6:13 PM, Eli Friedman <eli.friedman at gmail.com>wrote:

> On Tue, Aug 13, 2013 at 11:17 AM, George Kastrinis <
> george.kastrinis at logicblox.com> wrote:
>
>> Hi all,
>>
>> We are working on a Clang plugin, and we wan to have a way to uniquely
>> identify every declaration in a C++ program. We tried using the following.
>> (presumed location start, presumed location end, spelling location start,
>> spelling location end, declaration kind)
>>
>> But we still have a problem.
>>
>> For example, in /usr/include/x86_64-linux-gnu/bits/cmathcalls.h, line 101
>> a macro called _MATHCALL is used. If you look at /usr/include/complex.h,
>> line 65 where the macro is defined, you will see that the macro uses other
>> macros inside and create two functions (e.g. cpowf and __cpowf)
>>
>> I tried using spelling locations, presumed locations,
>> SourceManager::getExpansionLoc on the spelling location. All give the same
>> locations for cpowf and __cpowf.
>>
>> Is there any way to achieve what I try to do here?
>>
>
> If you really need to serialize SourceLocations, you really need to encode
> the entire macro expansion stack.
>  SourceManager::getImmediateMacroCallerLoc might be helpful here.
>
> -Eli
>



-- 

George Kastrinis
http://gkastrinis.info/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20130814/ec632e74/attachment.html>


More information about the cfe-dev mailing list