Skip to content
xiehuc edited this page Jun 23, 2014 · 1 revision

the common topic about profiling

llvmprof.out format

该部分代码在 libprofile 目录下.首先是argument info,是所有的prof种类都有的. 首先在main函数里面插入start_profiling函数,在其中会调用save_arguments保存运行时 参数,然后在getOutFile的时候,会首先写入这些参数.

之后,根据不同的profiling类型,其格式不同.比如edge profiling,会插入profiling类型 (EdgeInfo,int长度),数组长度(int型),数组内容.edge profiling,首先扫描一遍代码,计 算出一共有多少个basicblock,这个数组的长度则是固定的.如果是执行了某个basicblock, 那只要在映射的数组中加1即可.当读取的时候,只要保证重新生成这个映射保持顺序不变, 则可以把数据还原出来.

reading llvmprof.out 's progress

  1. 首先创建ProfileInfoLoaderPass,在其中会生成一个ProfileInfoLoader
  2. ProfileInfoLoader,负责读取llvmprof.out的原始数据,它只是简单的把信息读取到内 存保留最基本的格式,不做进一步的整理.
  3. 之后回到之前的Pass,由于这个Pass继承自ProfileInfo,所以可以简单理解为 ProfileInfo,它会继续把原始数据加工成便于运算的结构体(定义于ProfileInfo.h ). 看需要提供怎样的服务就需要怎样的数据结构,大部分profiling都是用一个map并且第 一个参数是Function类型(第二个参数可能是简单的double,或者是复杂的数组),这是 由于这些profiling在创建的时候是迭代函数,再迭代basicblock的方式创建的.每次使 用相同的迭代方式,迭代的顺序就是一样的,所以在写入的时候和读取的时候能工成功 的建立正确的映射.
  4. 最后,外部程序include "ProfileInfo.h" ,通过getAnalysis<ProfileInfo>,会得 到上面建立好的结构,然后通过ProfileInfo中定义的接口来访问数据.
Clone this wiki locally