<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    No, I don't care about those functions that aren't called.<br>
    <br>
    Okay, I walked through the EmitCall family of functions of
    CodeGenFunction, but didn't notice much. I guess that I'll have to
    trace them through more carefully to see when it is done.<br>
    <br>
    My thought is to copy the debug info metadata emission logic used
    during generating the function prolog to function declarations. Do
    you think if it works?<br>
    <br>
    Thanks,<br>
    <br>
    <div class="moz-cite-prefix">On 11/12/2013 07:49 AM, David Blaikie
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAENS6Etb7AeyzpkFf09QMoDpFwcv+PuT3fBU0-LxgOhSjghcoQ@mail.gmail.com"
      type="cite">
      <div dir="ltr">Do you care about generating debug info for
        declarations of functions that aren't even called? If so, then
        the approach you're taking will be insufficient (since we won't
        even emit an IR declaration for such a function)<br>
        <br>
        If not, then you might want to take a look at where the IR for
        the call is constructed (I don't know where this is, but you
        seem to be gaining some proficiency tracing through Clang/LLVM
        internals that will serve you well here) and then see how the
        target of the call is built and passed in to that.</div>
      <div class="gmail_extra"><br>
        <br>
        <div class="gmail_quote">On Mon, Nov 11, 2013 at 3:44 PM, Lewis
          Burns <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:lewisurn@gmail.com" target="_blank">lewisurn@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF"> I ran Clang in a
              debugger and traced how debug info metadata was emitted.
              It's a part of code generation of functions.<br>
              <br>
              I have a question about when the declaration of an extern
              function is emitted. For example, I have very simple code:<br>
              <br>
              <font face="Courier New, Courier, monospace">extern int
                convert(unsigned u);<br>
                <br>
                void foo() {<br>
                  int x = convert(0);<br>
                }<br>
              </font><br>
              The corresponding LLVM code is:<br>
              <br>
              <font face="Courier New, Courier, monospace">...<br>
                ; Function Attrs: nounwind uwtable<br>
                define void @foo() #0 {<br>
                entry:<br>
                  %x = alloca i32, align 4<br>
                  call void @llvm.dbg.declare(metadata !{i32* %x},
                metadata !8), !dbg !10<br>
                  %call = call i32 @convert(i32 0), !dbg !10<br>
                  store i32 %call, i32* %x, align 4, !dbg !10<br>
                  ret void, !dbg !11<br>
                }<br>
                ...<br>
                declare i32 @convert(i32) #2  // when this line is
                emitted<br>
              </font><br>
              My question is where the "<font face="Courier New,
                Courier, monospace">declare i32 @convert(i32) #2"</font>
              line is emitted. I tried many breakpoints in EmitXXX
              family of functions in CodeGenModule and noticed that this
              piece of code<br>
              <br>
              <font face="Courier New, Courier, monospace">  // Ignore
                declarations, they will be emitted on their first use.<br>
                  if (const FunctionDecl *FD =
                dyn_cast<FunctionDecl>(Global)) {<br>
                    // Forward declarations are emitted lazily on first
                use.<br>
                    if (!FD->doesThisDeclarationHaveABody()) {<br>
                      if
                (!FD->doesDeclarationForceExternallyVisibleDefinition())<br>
                        return;<br>
              </font><br>
              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.<br>
              <br>
              Any help is really appreciated.
              <div class="im"><br>
                <br>
                <div>On 11/09/2013 04:14 PM, David Blaikie wrote:<br>
                </div>
              </div>
              <div>
                <div class="h5">
                  <blockquote type="cite">
                    <p dir="ltr">For those following this thread a
                      critical detail would be that you want debug info
                      metadata.</p>
                    <p dir="ltr">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)</p>
                    <p dir="ltr">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.</p>
                    <div class="gmail_quote">On Nov 9, 2013 7:59 AM,
                      "Lewis Burns" <<a moz-do-not-send="true"
                        href="mailto:lewisurn@gmail.com" target="_blank">lewisurn@gmail.com</a>>

                      wrote:<br type="attribution">
                      <blockquote class="gmail_quote" style="margin:0 0
                        0 .8ex;border-left:1px #ccc
                        solid;padding-left:1ex">
                        <div text="#000000" bgcolor="#FFFFFF"> Hi,<br>
                          <br>
                          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:<br>
                          <br>
                          <font face="Courier New, Courier, monospace">extern
                            int convert(unsigned u);</font><br>
                          <br>
                          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<br>
                          <font face="Courier New, Courier, monospace"><br>
                            int convert(unsigned u) {return 0;}<br>
                            <br>
                            !3 = metadata !{metadata !4, metadata !10,
                            metadata !33}<br>
                            !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]<br>
                            !7 = metadata !{metadata !8, metadata !9}<br>
                            !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]<br>
                            !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]<br>
                          </font><br>
                          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.<br>
                          <br>
                          By looking at the Clang AST for the extern
                          declared function<br>
                          <br>
                          <font face="Courier New, Courier, monospace">|-FunctionDecl

                            0x70598c0 <line:23:1, col:30> convert
                            'int (unsigned int)' extern<br>
                            | |-ParmVarDecl 0x7059800 <col:20,
                            col:29> u 'unsigned int'<br>
                          </font><br>
                          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?<br>
                          <br>
                          Thanks very much,<br>
                           <br>
                          <pre cols="72">-- 
Lewis</pre>
                        </div>
                        <br>
                        _______________________________________________<br>
                        cfe-dev mailing list<br>
                        <a moz-do-not-send="true"
                          href="mailto:cfe-dev@cs.uiuc.edu"
                          target="_blank">cfe-dev@cs.uiuc.edu</a><br>
                        <a moz-do-not-send="true"
                          href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev"
                          target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
                        <br>
                      </blockquote>
                    </div>
                  </blockquote>
                  <br>
                </div>
              </div>
              <span class="HOEnZb"><font color="#888888">
                  <pre cols="72">-- 
Lewis</pre>
                </font></span></div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
Lewis</pre>
  </body>
</html>