xuruobin via llvm-dev
2019-Jan-24 07:36 UTC
[llvm-dev] 答复: 答复: How to add new arch for llvm-cov show?
Hi vedant, 1. The definition is from llvm/Supprot/ELF.h. But this machine information(e_machine) is given to compiler at lib/MC/ELFObjectWriter.cpp. I greped the whole llvm project and found that e_machine was assigned at only two files. One was lib/MC/ELFObjectWriter.cpp(there was an comment said “e_machine=target”) and the other was tools/obj2yaml/elf2yaml.cpp(GDB stopped only at the former one when using x86_64 llvm-cov so I thought it was MC provide this e_machine information to compiler). 2. New error was “Failed to load coverage: No coverage data found” since the compiler cannot get NamesSection(at loadBinaryFormat in CoverageMappingReader.cpp). I thought it was my ldscript problem because I put __llvm_prf_names, __llvm_prf_cnts, __llvm_prf_data and __llvm_prf_vnds inside .rodata section. Compiler checked .rodata but not things inside .rodata. What’s the right position to put these 4 __llvm_prf_* sections? Best, Ruobin. 发件人: vsk at apple.com [mailto:vsk at apple.com] 代表 Vedant Kumar 发送时间: 2019年1月24日 0:12 收件人: xuruobin <xuruobin at huawei.com> 抄送: vsk at apple.com; llvm-dev at lists.llvm.org; Yuchao (Michael) <michael.yuchao at huawei.com> 主题: Re: 答复: [llvm-dev] How to add new arch for llvm-cov show? On Jan 23, 2019, at 1:24 AM, xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> wrote: Hi vedant, The program didn't pass the checking "OF->getArch() != Triple(Arch).getArch()" loadBinaryFormat in CoverageMappingReader.cpp and returned an error. It's because "OF->getArch()" returned null and "Triple(Arch).getArch()" returned XXXX(name of my arch). The returned value of " OF->getArch()" is decided by " EF.getHeader()->e_machine" but I found "e_machine" is defined somewhere in MCAssembler I haven’t double-checked, but I thought this definition came from llvm/Support/ELF.h? (My compiler uses binutils as assembler) . Although I make some hacks to pass this checking, I still get other errors. So my problem is whether llvm-cov has to work with MCAssembler and is it possible to do it with binutils? Coverage support should be / is largely compatible with binutils, but you may have to watch out for this BFD bug: https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#drawbacks-and-limitations What is the error you see? vedant Best, Ruobin -----邮件原件----- 发件人: vsk at apple.com<mailto:vsk at apple.com> [mailto:vsk at apple.com] 发送时间: 2019年1月23日 1:24 收件人: xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> 抄送: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>; Yuchao (Michael) <michael.yuchao at huawei.com<mailto:michael.yuchao at huawei.com>> 主题: Re: [llvm-dev] How to add new arch for llvm-cov show? Hi Ruobin, On Jan 21, 2019, at 5:21 PM, xuruobin via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote: Hi all, I'm trying to support llvm-cov for a new architecture and I have successfully built compiler-rt for my arch. Following steps shown in https://clang.llvm.org/docs/SourceBasedCodeCoverage.html , I encountered an error for the last step(step of llvm-cov show). The command line was (supposed my arch is XXXX) "llvm-cov show -arch=XXXX ./foo -instr-profile=foo.profdata" and the error was "Failed to load coverage: No object file for requested architecture." I think I should add my arch information to somewhere(maybe an llvm-cov support list?) but I don't know where to add these information. Can someone give me some suggestions? You’ll need to teach libObject about this architecture. Specifically, the coverage reader checks that calling getArch() on a loaded ObjectFile matches Triple(Arch).getArch() (see loadBinaryFormat in CoverageMappingReader.cpp). best, vedant Best Regards, Ruobin. _______________________________________________ LLVM Developers mailing list llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190124/4d59147e/attachment.html>
Vedant Kumar via llvm-dev
2019-Jan-24 19:13 UTC
[llvm-dev] How to add new arch for llvm-cov show?
> On Jan 23, 2019, at 11:36 PM, xuruobin <xuruobin at huawei.com> wrote: > > Hi vedant, > > 1. The definition is from llvm/Supprot/ELF.h. But this machine information(e_machine) is given to compiler at lib/MC/ELFObjectWriter.cpp. I greped the whole llvm project and found that e_machine was assigned at only two files. One was lib/MC/ELFObjectWriter.cpp(there was an comment said “e_machine=target”) and the other was tools/obj2yaml/elf2yaml.cpp(GDB stopped only at the former one when using x86_64 llvm-cov so I thought it was MC provide this e_machine information to compiler).First, I think this reinforces my theory that llvm’s object file reading libraries do not “understand” the architecture you’re working on. Second — and I’m not super familiar with this part of the codebase, so apologies for any mistakes here — you might have missed the ELF file reader? $ git grep -iE "\<e_?machine\>” lib … lib/Object/ELF.cpp: return getDynamicTagAsString(getHeader()->e_machine, Type);> 2. New error was “Failed to load coverage: No coverage data found” since the compiler cannot get NamesSection(at loadBinaryFormat in CoverageMappingReader.cpp). I thought it was my ldscript problem because I put __llvm_prf_names, __llvm_prf_cnts, __llvm_prf_data and __llvm_prf_vnds inside .rodata section. Compiler checked .rodata but not things inside .rodata. What’s the right position to put these 4 __llvm_prf_* sections?I’m not sure what changed, exactly, between the point you encountered the last error and this one. Could you elaborate? This is just a shot in the dark, but you may need to teach getInstrProfSectionName about any custom linker directives needed for your architecture. vedant> > Best, > Ruobin. > > 发件人: vsk at apple.com [mailto:vsk at apple.com] 代表 Vedant Kumar > 发送时间: 2019年1月24日 0:12 > 收件人: xuruobin <xuruobin at huawei.com> > 抄送: vsk at apple.com; llvm-dev at lists.llvm.org; Yuchao (Michael) <michael.yuchao at huawei.com> > 主题: Re: 答复: [llvm-dev] How to add new arch for llvm-cov show? > > > On Jan 23, 2019, at 1:24 AM, xuruobin <xuruobin at huawei.com <mailto:xuruobin at huawei.com>> wrote: > > Hi vedant, > > The program didn't pass the checking "OF->getArch() != Triple(Arch).getArch()" loadBinaryFormat in CoverageMappingReader.cpp and returned an error. It's because "OF->getArch()" returned null and "Triple(Arch).getArch()" returned XXXX(name of my arch). > The returned value of " OF->getArch()" is decided by " EF.getHeader()->e_machine" but I found "e_machine" is defined somewhere in MCAssembler > > I haven’t double-checked, but I thought this definition came from llvm/Support/ELF.h? > > > > (My compiler uses binutils as assembler) . Although I make some hacks to pass this checking, I still get other errors. So my problem is whether llvm-cov has to work with MCAssembler and is it possible to do it with binutils? > > Coverage support should be / is largely compatible with binutils, but you may have to watch out for this BFD bug: https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#drawbacks-and-limitations <https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#drawbacks-and-limitations> > > What is the error you see? > > vedant > > > > Best, > Ruobin > > > -----邮件原件----- > 发件人: vsk at apple.com <mailto:vsk at apple.com> [mailto:vsk at apple.com <mailto:vsk at apple.com>] > 发送时间: 2019年1月23日 1:24 > 收件人: xuruobin <xuruobin at huawei.com <mailto:xuruobin at huawei.com>> > 抄送: llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>; Yuchao (Michael) > <michael.yuchao at huawei.com <mailto:michael.yuchao at huawei.com>> > 主题: Re: [llvm-dev] How to add new arch for llvm-cov show? > > Hi Ruobin, > > On Jan 21, 2019, at 5:21 PM, xuruobin via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> > wrote: > > Hi all, > > I'm trying to support llvm-cov for a new architecture and I have successfully > built compiler-rt for my arch. Following steps shown in > https://clang.llvm.org/docs/SourceBasedCodeCoverage.html <https://clang.llvm.org/docs/SourceBasedCodeCoverage.html> , I encountered > an error for the last step(step of llvm-cov show). > The command line was (supposed my arch is XXXX) > > "llvm-cov show -arch=XXXX ./foo -instr-profile=foo.profdata" > > and the error was > > "Failed to load coverage: No object file for requested architecture." > > I think I should add my arch information to somewhere(maybe an llvm-cov > support list?) but I don't know where to add these information. Can > someone give me some suggestions? > > You’ll need to teach libObject about this architecture. Specifically, the > coverage reader checks that calling getArch() on a loaded ObjectFile matches > Triple(Arch).getArch() (see loadBinaryFormat in > CoverageMappingReader.cpp). > > best, > vedant > > > > Best Regards, > Ruobin. > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190124/8ddd6d6a/attachment-0001.html>
xuruobin via llvm-dev
2019-Jan-25 02:15 UTC
[llvm-dev] 答复: How to add new arch for llvm-cov show?
Hi vedant, 1. First, I think your theory is right that llvm’s object file reading libraries do not “understand” the architecture I’m working on. Since I’m using binutils as assembler which means llvm can only provide asm and object file is provided by biutils. I think these ELF header information is provided by my binutils now, so maybe I have to modify binutils code to provide ELF header to llvm? Second, I’m sorry to say that I’m now working on llvm-4.0.0 and in ELF.cpp there is no “return getDynamicTagAsString(getHeader()->e_machine, Type);”. But I think it makes sense ELF file reader get nothing because my compiler doesn’t write these information. It seems I have to find somewhere(maybe an ELF file writer) to write e_machine so my reader will read this. But I have no idea where to write it now. 2. In CoverageMapping.cpp, there is a checking “OF->getArch() != Triple(Arch).getArch()” and it makes an error if not equal. “OF->getArch” will go into a switch/case and the code enters the default branch which returns an UnknownArch. I hacked the code to make default branch return Triple::XXXX(only a temporary solution for the first point). Where should I place __llvm_prf_* sections? Is it ok to put them into .rodata section? Best, Ruobin 发件人: vsk at apple.com [mailto:vsk at apple.com] 代表 Vedant Kumar 发送时间: 2019年1月25日 3:14 收件人: xuruobin <xuruobin at huawei.com> 抄送: llvm-dev at lists.llvm.org; Yuchao (Michael) <michael.yuchao at huawei.com> 主题: Re: [llvm-dev] How to add new arch for llvm-cov show? On Jan 23, 2019, at 11:36 PM, xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> wrote: Hi vedant, 1. The definition is from llvm/Supprot/ELF.h. But this machine information(e_machine) is given to compiler at lib/MC/ELFObjectWriter.cpp. I greped the whole llvm project and found that e_machine was assigned at only two files. One was lib/MC/ELFObjectWriter.cpp(there was an comment said “e_machine=target”) and the other was tools/obj2yaml/elf2yaml.cpp(GDB stopped only at the former one when using x86_64 llvm-cov so I thought it was MC provide this e_machine information to compiler). First, I think this reinforces my theory that llvm’s object file reading libraries do not “understand” the architecture you’re working on. Second — and I’m not super familiar with this part of the codebase, so apologies for any mistakes here — you might have missed the ELF file reader? $ git grep -iE "\<e_?machine\>” lib … lib/Object/ELF.cpp: return getDynamicTagAsString(getHeader()->e_machine, Type); 2. New error was “Failed to load coverage: No coverage data found” since the compiler cannot get NamesSection(at loadBinaryFormat in CoverageMappingReader.cpp). I thought it was my ldscript problem because I put __llvm_prf_names, __llvm_prf_cnts, __llvm_prf_data and __llvm_prf_vnds inside .rodata section. Compiler checked .rodata but not things inside .rodata. What’s the right position to put these 4 __llvm_prf_* sections? I’m not sure what changed, exactly, between the point you encountered the last error and this one. Could you elaborate? This is just a shot in the dark, but you may need to teach getInstrProfSectionName about any custom linker directives needed for your architecture. vedant Best, Ruobin. 发件人: vsk at apple.com<mailto:vsk at apple.com> [mailto:vsk at apple.com] 代表 Vedant Kumar 发送时间: 2019年1月24日 0:12 收件人: xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> 抄送: vsk at apple.com<mailto:vsk at apple.com>; llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>; Yuchao (Michael) <michael.yuchao at huawei.com<mailto:michael.yuchao at huawei.com>> 主题: Re: 答复: [llvm-dev] How to add new arch for llvm-cov show? On Jan 23, 2019, at 1:24 AM, xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> wrote: Hi vedant, The program didn't pass the checking "OF->getArch() != Triple(Arch).getArch()" loadBinaryFormat in CoverageMappingReader.cpp and returned an error. It's because "OF->getArch()" returned null and "Triple(Arch).getArch()" returned XXXX(name of my arch). The returned value of " OF->getArch()" is decided by " EF.getHeader()->e_machine" but I found "e_machine" is defined somewhere in MCAssembler I haven’t double-checked, but I thought this definition came from llvm/Support/ELF.h? (My compiler uses binutils as assembler) . Although I make some hacks to pass this checking, I still get other errors. So my problem is whether llvm-cov has to work with MCAssembler and is it possible to do it with binutils? Coverage support should be / is largely compatible with binutils, but you may have to watch out for this BFD bug: https://clang.llvm.org/docs/SourceBasedCodeCoverage.html#drawbacks-and-limitations What is the error you see? vedant Best, Ruobin -----邮件原件----- 发件人: vsk at apple.com<mailto:vsk at apple.com> [mailto:vsk at apple.com] 发送时间: 2019年1月23日 1:24 收件人: xuruobin <xuruobin at huawei.com<mailto:xuruobin at huawei.com>> 抄送: llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>; Yuchao (Michael) <michael.yuchao at huawei.com<mailto:michael.yuchao at huawei.com>> 主题: Re: [llvm-dev] How to add new arch for llvm-cov show? Hi Ruobin, On Jan 21, 2019, at 5:21 PM, xuruobin via llvm-dev <llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org>> wrote: Hi all, I'm trying to support llvm-cov for a new architecture and I have successfully built compiler-rt for my arch. Following steps shown in https://clang.llvm.org/docs/SourceBasedCodeCoverage.html , I encountered an error for the last step(step of llvm-cov show). The command line was (supposed my arch is XXXX) "llvm-cov show -arch=XXXX ./foo -instr-profile=foo.profdata" and the error was "Failed to load coverage: No object file for requested architecture." I think I should add my arch information to somewhere(maybe an llvm-cov support list?) but I don't know where to add these information. Can someone give me some suggestions? You’ll need to teach libObject about this architecture. Specifically, the coverage reader checks that calling getArch() on a loaded ObjectFile matches Triple(Arch).getArch() (see loadBinaryFormat in CoverageMappingReader.cpp). best, vedant Best Regards, Ruobin. _______________________________________________ LLVM Developers mailing list llvm-dev at lists.llvm.org<mailto:llvm-dev at lists.llvm.org> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190125/47eb06c5/attachment.html>
Apparently Analagous Threads
- 答复: 答复: How to add new arch for llvm-cov show?
- 答复: How to add new arch for llvm-cov show?
- How to add new arch for llvm-cov show?
- How data is laid out in default.profraw when doing profiling?
- Assembly mimatch between windows and linux llvm.(probably caused by sort algorithm)