[llvm-dev] [cfe-dev] [PATCH/DRAFT] Embed metadata into object file

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 1 09:36:17 PDT 2016


> On Apr 1, 2016, at 5:20 AM, Christian Dietrich via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Adrian Prantl <aprantl at apple.com> writes:
> 
>> Depending on your needs, just using a global with the “section”
>> attribute might also work for you:
>> http://llvm.org/docs/LangRef.html#global-variables
> 
> I was aware of that possibility. But, there are several drawbacks to
> using global variables and the current infrastructure from a clang
> plugin's point of view:
> 
> 1. It feels like a hack. It is not an idiomatic way of transporting
>   information alongside with an translation unit.
> 
> 2. A clang plugin is mostly defined by it's ASTConsumer; there is no
>   direct access to the produced LLVM intermediate representation. I
>   would have to insert AST elements that result in the attributed
>   global variable. [1]
> 
> 3. A more idealistic problem I have with this solution is that we change
>   the actual (semantic) content of the module. But I only want to carry
>   _metadata_ about the module alongside.
> 
> 4. There already is an good metadata infrastructure in LLVM and a very
>   good attribute infrastructure in clang. Why not utilize them?
> 
> So my question is:
> 
>   I want to generate and attach (structured) metadata at every point in
>   life cycle (AST, LLVM module, object file) of a module and retrieve it
>   from the compilation results. How can I do that?

Worded like that, I can see a close analogy with  "Debug Info".


> At the moment, my patches are only a proposal to solve this for a very
> specifc use case (mine): attaching single strings. I think, furthermore,
> that it would also be handy to materialize and retrieve more complex
> metadata types to/from object files. For example, we could serialize
> LLVM metadata trees into separate sections:
> 
>   !llvm.extra_sections = {!0}
>   !0 = !{!"clang.myanalysis", !1, !2}
>   !1 = !{ i32 15, i32 28, i32 142}
>   !2 = !{!"key", i32 10000, !"key2", i32 9999}
> 
> I'm not sure whether this would be useful and reusable for others. So:
> Do you think this would be useful for other developers as well?
> 
> chris
> 
> 
> [1] This is a _seperate_ drawback of clang plugins at the moment: They
>    cannot define an LLVM IR transformation that should be applied when
>    the plugin is active.

You can write clang plugin that are LLVM pass and insert them in the pipeline.


> I think it would be useful for many analyzes
>    to have access both to the AST and to the IR.

This is more fuzzy to me, I don't know enough about clang but I'm not sure the design allow to keep a link from the IR to the clang AST? (If it is the case, I'd be curious to see how it works).

Best,

-- 
Mehdi




More information about the llvm-dev mailing list