[cfe-dev] output metadata for extern declared functions?

Lewis Burns lewisurn at gmail.com
Mon Nov 11 15:44:14 PST 2013


I ran Clang in a debugger and traced how debug info metadata was 
emitted. It's a part of code generation of functions.

I have a question about when the declaration of an extern function is 
emitted. For example, I have very simple code:

extern int convert(unsigned u);

void foo() {
   int x = convert(0);
}

The corresponding LLVM code is:

...
; Function Attrs: nounwind uwtable
define void @foo() #0 {
entry:
   %x = alloca i32, align 4
   call void @llvm.dbg.declare(metadata !{i32* %x}, metadata !8), !dbg !10
   %call = call i32 @convert(i32 0), !dbg !10
   store i32 %call, i32* %x, align 4, !dbg !10
   ret void, !dbg !11
}
...
declare i32 @convert(i32) #2  // when this line is emitted

My question is where the "declare i32 @convert(i32) #2" line is emitted. 
I tried many breakpoints in EmitXXX family of functions in CodeGenModule 
and noticed that this piece of code

   // Ignore declarations, they will be emitted on their first use.
   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Global)) {
     // Forward declarations are emitted lazily on first use.
     if (!FD->doesThisDeclarationHaveABody()) {
       if (!FD->doesDeclarationForceExternallyVisibleDefinition())
         return;

causes the postpone of emission of the convert function declaration, but 
I couldn't figure out where and when the declaration is emitted. I set a 
breakpoint in the CodeGenModule::EmitDeferred() function, but nothing 
was done in that function.

Any help is really appreciated.

On 11/09/2013 04:14 PM, David Blaikie wrote:
>
> For those following this thread a critical detail would be that you 
> want debug info metadata.
>
> There's no simple flag for this as we don't attach the function debug 
> info metadata to every declaration, just to definitions (there's no 
> filtering step)
>
> But why do you want this anyway? If you're performing 
> optimizations/transformations based on debug info metadata, that's not 
> really the desired approach. Debug info is not meant to affect code 
> generation.
>
> On Nov 9, 2013 7:59 AM, "Lewis Burns" <lewisurn at gmail.com 
> <mailto:lewisurn at gmail.com>> wrote:
>
>     Hi,
>
>     I haven't worked on Clang before and have a simple question
>     (supposedly) for those who are familiar with metadata and LLVM
>     bitcode generation. Assume that I have a function which is
>     declared as extern as the following:
>
>     extern int convert(unsigned u);
>
>     I want to have Clang generate metadata nodes for it by adding a
>     metadata node of subprogram into the list of subprograms defined
>     in the current compilation unit. The subprogram metadata node and
>     its associated nodes should have the info of the type signature.
>     For example, I get the following set of metadata nodes for function
>
>     int convert(unsigned u) {return 0;}
>
>     !3 = metadata !{metadata !4, metadata !10, metadata !33}
>     !4 = metadata !{i32 786478, metadata !1, metadata !5, metadata
>     !"convert", metadata !"convert", metadata !"", i32 23, metadata
>     !6, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32
>     (i32)* @convert, null, null, metadata !2, i32 23} ; [
>     DW_TAG_subprogram ] [line 23] [def] [convert]
>     !7 = metadata !{metadata !8, metadata !9}
>     !8 = metadata !{i32 786468, null, null, metadata !"int", i32 0,
>     i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] [int]
>     [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]
>     !9 = metadata !{i32 786468, null, null, metadata !"unsigned int",
>     i32 0, i64 32, i64 32, i64 0, i32 0, i32 7} ; [ DW_TAG_base_type ]
>     [unsigned int] [line 0, size 32, align 32, offset 0, enc
>     DW_ATE_unsigned]
>
>     which allows me to extract the source-level type signature for the
>     function by using LLVM debug info APIs. I'd like to get the
>     source-level type signature of the extern declared function, but
>     Clang does not produce metadata for it.
>
>     By looking at the Clang AST for the extern declared function
>
>     |-FunctionDecl 0x70598c0 <line:23:1, col:30> convert 'int
>     (unsigned int)' extern
>     | |-ParmVarDecl 0x7059800 <col:20, col:29> u 'unsigned int'
>
>     I know that Clang has the information I need, and I just need to
>     turn off or remove the filter that ignores functions whose bodies
>     are not available during metadata node or/and code generation. Are
>     there simple switches that do this? If not, can anyone please
>     explain how to do it by pointing me to the right code snippets?
>
>     Thanks very much,
>
>     -- 
>     Lewis
>
>
>     _______________________________________________
>     cfe-dev mailing list
>     cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
>     http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>

-- 
Lewis

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20131111/5477b712/attachment.html>


More information about the cfe-dev mailing list