[llvm-dev] [RFC] Introduce Dump Accumulator

Hal Finkel via llvm-dev llvm-dev at lists.llvm.org
Wed Aug 5 16:22:56 PDT 2020


I think that we should think about the relationship between this 
proposed mechanism and the existing mechanism that we have for emitting 
and capturing optimization remarks. In some sense, I feel like we 
already have a lot of this capability (e.g., llc has -remarks-section).

  -Hal

On 8/5/20 5:51 PM, Johannes Doerfert via llvm-dev wrote:
> I like the ability, not sure about the proposed implementation though.
>
> Did you consider a flag that redirects `llvm::outs()` and `llvm::errs()`
>
> into sections of the object file instead? So, you'd say:
>
>
> `clang ... -mllvm -debug-only=inline ... -mllvm -dump-section=.dump`
>
>
> and you'd get the regular debug output nicely ordered in the `.dump` 
> section.
>
> I mainly want to avoid even more output code in the passes but also be 
> able
>
> to collect at least that information. That doesn't mean we couldn't 
> add another
>
> output stream that would always/only redirect into the sections.
>
>
> ~ Johannes
>
>
> On 8/5/20 5:36 PM, Kazu Hirata via llvm-dev wrote:
>> Introduction
>> ============
>>
>> This RFC proposes a mechanism to dump arbitrary messages into object
>> files during compilation and retrieve them from the final executable.
>>
>> Background
>> ==========
>>
>> We often need to collect information from all object files of
>> applications.  For example:
>>
>> - Mircea Trofin needs to collect information from the function
>>    inlining pass so that he can train the machine learning model with
>>    the information.
>>
>> - I sometimes need to dump messages from optimization passes to see
>>    where and how they trigger.
>>
>> Now, this process becomes challenging when we build large applications
>> with a build system that caches and distributes compilation jobs.  If
>> we were to dump messages to stderr, we would have to be careful not to
>> interleave messages from multiple object files.  If we were to modify
>> a source file, we would have to flush the cache and rebuild the entire
>> application to collect dump messages from all relevant object files.
>>
>> High Level Design
>> =================
>>
>> - LLVM: We provide machinery for individual passes to dump arbitrary
>>    messages into a special ELF section in a compressed manner.
>>
>> - Linker: We simply concatenate the contents of the special ELF
>>    section.  No change is needed.
>>
>> - llvm-readobj: We add an option to retrieve the contents of the
>>    special ELF section.
>>
>> Detailed Design
>> ===============
>>
>> DumpAccumulator analysis pass
>> -----------------------------
>>
>> We create a new analysis pass called DumpAccumulator.  We add the
>> analysis pass right at the beginning of the pass pipeline.  The new
>> analysis pass holds the dump messages throughout the pass pipeline.
>>
>> If you would like to dump messages from some pass, you would obtain
>> the result of DumpAccumulator in the pass:
>>
>>    DumpAccumulator::Result *DAR = 
>> MAMProxy.getCachedResult<DumpAccumulator>(M);
>>
>> Then dump messages:
>>
>>    if (DAR) {
>>      DAR->Message += "Processing ";
>>      DAR->Message += F.getName();
>>      DAR->Message += "\n";
>>    }
>>
>> AsmPrinter
>> ----------
>>
>> We dump the messages from DumpAccumulator into a section called
>> ".llvm_dump" in a compressed manner.  Specifically, the section
>> contains:
>>
>> - LEB128 encoding of the original size in bytes
>> - LEB128 encoding of the compressed size in bytes
>> - the message compressed by zlib::compressed
>>
>> in that order.
>>
>> llvm-readobj
>> ------------
>>
>> We read the .llvm_dump section.  We dump each chunk of compressed data
>> one after another.
>>
>> Existing Implementation
>> =======================
>> https://reviews.llvm.org/D84473
>>
>> Future Directions
>> =================
>>
>> The proposal above does not support the ThinLTO build flow.  To
>> support that, I am thinking about putting the message as metadata in
>> the IR at the prelink stage.
>>
>> Thoughts?
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-dev mailing list