[LLVMdev] Status of YAML IO?

Shankar Easwaran shankare at codeaurora.org
Tue Oct 30 07:12:40 PDT 2012


Hi Nick,

I had a few questions :-

1) Is there a way to validate that the input file is of a valid format, 
thats defined by the YAML Reader ?
2) How are you plannning to represent section groups in the YAML ?
3) How are you planning to support Atom specific flags ? Is there a way 
already ?
     (This would be needed to group similiar atoms together)
4) Are you planning to support representing shared libraries too in this 
model ?
5) are you planning to support dwarf information too ?

Thanks

Shankar Easwaran

On 10/29/2012 9:26 PM, Nick Kledzik wrote:
> Michael,
>
> To validate the refactor of YAML Reader/Writer using YAML I/O.  I 
> updated all the test cases to be compatible with YAML I/O.  One issue 
> that was a gnarly was how to handle the test cases with archives. 
>  Currently, we have test cases like:
>
> ---
> atoms:
>     - name: foo
>      # more stuff
> ---
> archive:
>    - name bar.o
>      atoms:
>  - name:  bar
>         # more stuff
>
>
> This sort of weak/dynamic typing is hard to using with YAML I/O which 
> enforces stronger typing which helps it do better error checking.   
> The core of the problem is when a new document is started, we don't 
> know what kind of file it is going to be, to know what keys are legal. 
>   I first looked into used tags to specify the document type.  For 
> example:
>
> --- !archive
> members:
>    - name: bar.o
>    # more stuff
>
> But after modifying YAMLParser to make that the tag available, then 
> trying to figure out how to make the tag actionable in the trait, I 
> realized that for maps, the tag is just like another key.  So, if 
> every client agreed that the first key/value was a particular key name 
> (e.g. tag:  type) which YAML I/O already supports, then there is no 
> need for tags and no need for an additional mechanism in YAML I/O.
>
> So, I know have the traits set up to support archives assuming the 
> first (option) key of each document type read by lld will be "kind:". 
>  The archive-basic.objctxt case now looks like:
>
> # RUN: lld-core %s | FileCheck %s
>
> #
> # Tests archives in YAML. Tests that an undefined in a regular file 
> will load
> # all atoms in select archive members.
> #
>
> ---
> defined-atoms:
>     - name:              foo
> type:              code
>
> undefined-atoms:
>     - name:              bar
>
> ---
> kind:                   archive
> members:
>   - name:               bar.o
> content:
> defined-atoms:
>   - name:              bar
>     scope:             global
>     type:              code
>
>   - name:              bar2
>     type:              code
>
>   - name:               baz.o
> content:
> defined-atoms:
>   - name:              baz
>     scope:             global
>     type:              code
>
>   - name:              baz2
>     type:              code
> ...
>
> # CHECK:       name:       foo
> # CHECK-NOT:  undefined-atoms:
> # CHECK:       name:       bar
> # CHECK:       name:       bar2
> # CHECK-NOT:   name:       baz
> # CHECK:       ...
>
> My thinking is that we can extend this to support embedded 
> COFF/ELF/MachO in yaml by using new kind values.  For example:
>
> ---
> kind:                   object-coff
> header:
>    # stuff
> sections:
>    # stuff
> symbols:
>    # stuff
> ...
>
> The MappingTrait<const ld::File*> will look at the kind value and 
> switch off it.   We just need an external function (per file format) 
> which can be called with the same mapping() parameters which will do 
> the io.map*() calls and have traits for platform specific types, 
>  which turns the yaml into an in-memory binary object, then runs the 
> Reader to return a File*.  I'll be prototyping this approach for mach-o.
>
> -Nick
>
>
> On Oct 25, 2012, at 9:59 AM, Sean Silva wrote:
>>> To better understand how a client would use YAML I/O.  I've 
>>> completely rewritten the ReaderYAML and WriterYAML in lld to use 
>>> YAML I/O.  The source code is now about half the size.  But more 
>>> importantly,  the error checking is much, much better and any time 
>>> an attribute (e.g. of an Atom) is changed or added, there is just 
>>> one place to update the yaml code instead of two places (the reader 
>>> and writer).
>>
>> Fantastic!
>


-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by the Linux Foundation

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121030/7b2b134a/attachment.html>


More information about the llvm-dev mailing list