[cfe-dev] Seeking guidance to implement a new __attribute__ and implicit function parameter

Rick Mann rmann at latencyzero.com
Wed Jan 14 17:38:06 PST 2009


Hi. As an experiment, and as a way of familiarizing myself with  
clang's internals, I'd like to implement an extension to provide  
attributed functions (and methods) with call site information. The  
primary use for this is for diagnostic logging.

What I envision is this. You declare a function with an __attribute__,  
perhaps like this:

void FancyLog(const char* inFormat, ...)  
__attribute__((call_site_info(callInfo)));

And in the implementation, you can reference an implicit parameter  
named "callInfo" (the implementor can choose whatever name they want;  
maybe the attribute must be repeated on the function's implementation  
to get the actual parameter name):

  1 void FancyLog(const char* inFormat, ...)  
__attribute__((call_site_info(callInfo)))
  2 {
  3    printf("Got called from %s:%lu, func: %s: %s\n", callInfo- 
 >file, callInfo->line, callInfo->prettyFunc, inFormat);
  4 }

The function is called based on its formal parameter list:

  6 int main()
  7 {
  8     FancyLog("Now is the time %d %2\n", 1, 2);
  9 }

And the output generated would be something like:

Got called from main.c:3 main(): Now is the time 1 2

callInfo is a pointer to a clang-provided struct that looks something  
like:

struct __call_site_loc_info {
     const char*      file;
     uint32_t         line;
     const char*      prettyFunc;
};

Obviously I've left out some details, but here's what I need to do:

a) parse the new attribute and store the information (the fact that a  
function is to get this implicit parameter, the parameter's name) with  
the function information within clang's state

b) Parse the attribute at the function definition, to get the actual  
parameter name.

c) At each call site, allocate a __call_site_loc_info object on the  
stack, set the members appropriately (not sure where the __FILE__ and  
__PRETTY_FUNC__ strings end up, but I'd like to use those),

d) Create the implicit parameter pointing to the __call_site_loc_info  
struct.

If someone could point me at the right parts of clang to look at, I'd  
love to experiment with this extension. I've had a bit of discussion  
with Alex Rosenberg and others on this topic, and I agree that this  
probably isn't the best formal solution moving forward, but I think it  
makes for a good experiment, and a GREAT exercise for me in clang.

Any guidance would be much appreciated!

Thanks!

-- 
Rick




More information about the cfe-dev mailing list