<div dir="ltr"><div><div><div><div><div>Hi all,<br></div>  I am working on adding PGO to LDC (LLVM D Compiler). The current implementation<br>1) uses LLVM's InstrProf pass to generate an instrumented executable<br>2) links to compiler-rt/lib/profile for the runtime functionality to write a raw profile data file<br></div>3) uses llvm-profdata to merge profile data and convert from profraw to profdata format<br></div>4) uses llvm::IndexedInstrProfReader to read-in the profdata file for the 2nd PGO compile pass<br><br></div>This all works well with LLVM 3.7. While testing this with LLVM trunk, I run into a version compatibility problem between different versions of LLVM: I made a local copy of the compiler-rt/lib/profile release_37 version (with a few fixes for MSVC) and so steps 1,2, and 4 use LLVM trunk, but step 2 uses an older version of compiler-rt/lib/profile. Apparently, trunk's llvm-profdata cannot read raw profile data files generated by compiler-rt 3.7. Is this intended? Is llvm-profdata's output also incompatible between different versions of LLVM (InstrProfWriter/Reader are not meant to be compatible across LLVM versions) ?<br><br></div>LDC is currently compatible with LLVM 3.5 up to trunk. To support PGO for multiple LLVM versions (>= 3.7), I think that we will need to have a copy of compiler-rt/lib/profile for each version of LLVM >= 3.7. We also need to have a copy of llvm-profdata for each version of LLVM >= 3.7. We already do this with the FileCheck utility and will not be a big problem.<br><br>Does that make sense? What do you advise?<br><div><div><div><div><div><div><div><div><div><div><div><br></div><div>Thanks very much for your comments,<br></div><div>  Johan<br><br></div></div></div></div></div></div></div></div></div></div></div></div>