Mohamed Shafi via llvm-dev
2018-Mar-13 14:14 UTC
[llvm-dev] Profiling Support for BareMetal Target
Hi,
I followed two posts as my guideline
http://lists.llvm.org/pipermail/llvm-dev/2017-September/117339.html and
http://lists.llvm.org/pipermail/llvm-dev/2017-September/117156.html
I am using clang 4.0.1 and compiler-rt 4.0 release
1. I made changes in the LCF to mimic Linux Platform (for linker magic)
In data section i have added:
__start___llvm_prf_cnts = .;
KEEP(*(__llvm_prf_cnts))
__stop___llvm_prf_cnts = .;
__start___llvm_prf_data = .;
KEEP(*(__llvm_prf_data))
__stop___llvm_prf_data = .;
__start___llvm_prf_names = .;
KEEP(*(__llvm_prf_names))
__stop___llvm_prf_names = .;
__start___llvm_prf_vnds = .;
KEEP(*(__llvm_prf_vnds))
__stop___llvm_prf_vnds = .;
2. Since there are not .ctors or atexit available i called the
functions lprofSetupValueProfiler and __llvm_profile_initialize_file
from the startup before main and __llvm_profile_write_file during the
exit after main.
3. Made changes in the compiler-rt library to adapt the profile
sources for a bare metal target.
When i run the elf file of a simple return 0 main i do get a
default.profraw file and after processing the raw data using
llvm-profdata and llvm-cov all i get is
error: a.out: Failed to load coverage: No coverage data found
I could see the following :
$ llvm-profdata.exe show -detailed-summary default.profraw
Total functions: 1
Maximum function count: 1
Maximum internal block count: 0
Detailed summary:
Total number of blocks: 1
Total count: 1
0 blocks with count >= 0 account for 80 percentage of the total counts.
0 blocks with count >= 0 account for 90 percentage of the total counts.
0 blocks with count >= 0 account for 95 percentage of the total counts.
0 blocks with count >= 0 account for 99 percentage of the total counts.
0 blocks with count >= 0 account for 99.9 percentage of the total counts.
0 blocks with count >= 0 account for 99.99 percentage of the total counts.
0 blocks with count >= 0 account for 99.999 percentage of the total counts.
I am not sure what is wrong.
In the profiling library i see many entry points. I used
RegisterRuntime constructor to decide on the functions, that i
mentioned above, to be called in the startup routine . I am right in
that ?
Any idea as to what i am doing wrong ?
Regards,
Shafi
Vedant Kumar via llvm-dev
2018-Mar-14 01:16 UTC
[llvm-dev] Profiling Support for BareMetal Target
Hi,> On Mar 13, 2018, at 7:14 AM, Mohamed Shafi via llvm-dev <llvm-dev at lists.llvm.org> wrote: > > Hi, > > I followed two posts as my guideline > > http://lists.llvm.org/pipermail/llvm-dev/2017-September/117339.html and > http://lists.llvm.org/pipermail/llvm-dev/2017-September/117156.html > > I am using clang 4.0.1 and compiler-rt 4.0 release > > 1. I made changes in the LCF to mimic Linux Platform (for linker magic) > > In data section i have added: > > __start___llvm_prf_cnts = .; > KEEP(*(__llvm_prf_cnts)) > __stop___llvm_prf_cnts = .; > __start___llvm_prf_data = .; > KEEP(*(__llvm_prf_data)) > __stop___llvm_prf_data = .; > __start___llvm_prf_names = .; > KEEP(*(__llvm_prf_names)) > __stop___llvm_prf_names = .; > __start___llvm_prf_vnds = .; > KEEP(*(__llvm_prf_vnds)) > __stop___llvm_prf_vnds = .; > > 2. Since there are not .ctors or atexit available i called the > functions lprofSetupValueProfiler and __llvm_profile_initialize_file > from the startup before main and __llvm_profile_write_file during the > exit after main. > > 3. Made changes in the compiler-rt library to adapt the profile > sources for a bare metal target. > > When i run the elf file of a simple return 0 main i do get a > default.profraw file and after processing the raw data using > llvm-profdata and llvm-cov all i get is > error: a.out: Failed to load coverage: No coverage data found > > I could see the following : > > $ llvm-profdata.exe show -detailed-summary default.profraw > Total functions: 1 > Maximum function count: 1 > Maximum internal block count: 0 > Detailed summary: > Total number of blocks: 1 > Total count: 1 > 0 blocks with count >= 0 account for 80 percentage of the total counts. > 0 blocks with count >= 0 account for 90 percentage of the total counts. > 0 blocks with count >= 0 account for 95 percentage of the total counts. > 0 blocks with count >= 0 account for 99 percentage of the total counts. > 0 blocks with count >= 0 account for 99.9 percentage of the total counts. > 0 blocks with count >= 0 account for 99.99 percentage of the total counts. > 0 blocks with count >= 0 account for 99.999 percentage of the total counts. > > I am not sure what is wrong. > In the profiling library i see many entry points. I used > RegisterRuntime constructor to decide on the functions, that i > mentioned above, to be called in the startup routine . I am right in > that ? > > Any idea as to what i am doing wrong ?Perhaps there's just no __llvm_covmap section in the binary? That would explain the error. Can you retain that section with your linker script? best, vedant> > Regards, > Shafi > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev