[gcov] Assign names to some types and loaded values used in @__llvm_internal*

This makes the generated IR much more readable.
This commit is contained in:
Fangrui Song 2020-09-12 22:42:37 -07:00
parent 8cf1ac97ce
commit f086e85eea
2 changed files with 43 additions and 30 deletions

View File

@ -37,10 +37,10 @@ int test2(int b) {
} }
// CHECK: @__llvm_internal_gcov_emit_function_args.0 = internal unnamed_addr constant [2 x %0] // CHECK: @__llvm_internal_gcov_emit_function_args.0 = internal unnamed_addr constant [2 x %emit_function_args_ty]
// CHECK-SAME: [%0 { i32 0, i32 {{[-0-9]+}}, i32 {{[-0-9]+}} }, %0 { i32 1, i32 {{[-0-9]+}}, i32 {{[-0-9]+}} }] // CHECK-SAME: [%emit_function_args_ty { i32 0, i32 {{[-0-9]+}}, i32 {{[-0-9]+}} }, %emit_function_args_ty { i32 1, i32 {{[-0-9]+}}, i32 {{[-0-9]+}} }]
// CHECK: @__llvm_internal_gcov_emit_file_info = internal unnamed_addr constant [1 x %2] // CHECK: @__llvm_internal_gcov_emit_file_info = internal unnamed_addr constant [1 x %file_info]
/// 0x3330342a '3' '0' '4' '*' /// 0x3330342a '3' '0' '4' '*'
// 304-SAME: i32 858797098 // 304-SAME: i32 858797098
/// 0x3430372a '4' '0' '7' '*' /// 0x3430372a '4' '0' '7' '*'

View File

@ -1029,15 +1029,19 @@ Function *GCOVProfiler::insertCounterWriteout(
// Collect the relevant data into a large constant data structure that we can // Collect the relevant data into a large constant data structure that we can
// walk to write out everything. // walk to write out everything.
StructType *StartFileCallArgsTy = StructType::create( StructType *StartFileCallArgsTy = StructType::create(
{Builder.getInt8PtrTy(), Builder.getInt32Ty(), Builder.getInt32Ty()}); {Builder.getInt8PtrTy(), Builder.getInt32Ty(), Builder.getInt32Ty()},
"start_file_args_ty");
StructType *EmitFunctionCallArgsTy = StructType::create( StructType *EmitFunctionCallArgsTy = StructType::create(
{Builder.getInt32Ty(), Builder.getInt32Ty(), Builder.getInt32Ty()}); {Builder.getInt32Ty(), Builder.getInt32Ty(), Builder.getInt32Ty()},
"emit_function_args_ty");
StructType *EmitArcsCallArgsTy = StructType::create( StructType *EmitArcsCallArgsTy = StructType::create(
{Builder.getInt32Ty(), Builder.getInt64Ty()->getPointerTo()}); {Builder.getInt32Ty(), Builder.getInt64Ty()->getPointerTo()},
"emit_arcs_args_ty");
StructType *FileInfoTy = StructType *FileInfoTy =
StructType::create({StartFileCallArgsTy, Builder.getInt32Ty(), StructType::create({StartFileCallArgsTy, Builder.getInt32Ty(),
EmitFunctionCallArgsTy->getPointerTo(), EmitFunctionCallArgsTy->getPointerTo(),
EmitArcsCallArgsTy->getPointerTo()}); EmitArcsCallArgsTy->getPointerTo()},
"file_info");
Constant *Zero32 = Builder.getInt32(0); Constant *Zero32 = Builder.getInt32(0);
// Build an explicit array of two zeros for use in ConstantExpr GEP building. // Build an explicit array of two zeros for use in ConstantExpr GEP building.
@ -1147,41 +1151,46 @@ Function *GCOVProfiler::insertCounterWriteout(
// The index into the files structure is our loop induction variable. // The index into the files structure is our loop induction variable.
Builder.SetInsertPoint(FileLoopHeader); Builder.SetInsertPoint(FileLoopHeader);
PHINode *IV = PHINode *IV = Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2,
Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2); "file_idx");
IV->addIncoming(Builder.getInt32(0), BB); IV->addIncoming(Builder.getInt32(0), BB);
auto *FileInfoPtr = Builder.CreateInBoundsGEP( auto *FileInfoPtr = Builder.CreateInBoundsGEP(
FileInfoArrayTy, FileInfoArrayGV, {Builder.getInt32(0), IV}); FileInfoArrayTy, FileInfoArrayGV, {Builder.getInt32(0), IV});
auto *StartFileCallArgsPtr = auto *StartFileCallArgsPtr =
Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 0); Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 0, "start_file_args");
auto *StartFileCall = Builder.CreateCall( auto *StartFileCall = Builder.CreateCall(
StartFile, StartFile,
{Builder.CreateLoad(StartFileCallArgsTy->getElementType(0), {Builder.CreateLoad(StartFileCallArgsTy->getElementType(0),
Builder.CreateStructGEP(StartFileCallArgsTy, Builder.CreateStructGEP(StartFileCallArgsTy,
StartFileCallArgsPtr, 0)), StartFileCallArgsPtr, 0),
"filename"),
Builder.CreateLoad(StartFileCallArgsTy->getElementType(1), Builder.CreateLoad(StartFileCallArgsTy->getElementType(1),
Builder.CreateStructGEP(StartFileCallArgsTy, Builder.CreateStructGEP(StartFileCallArgsTy,
StartFileCallArgsPtr, 1)), StartFileCallArgsPtr, 1),
"version"),
Builder.CreateLoad(StartFileCallArgsTy->getElementType(2), Builder.CreateLoad(StartFileCallArgsTy->getElementType(2),
Builder.CreateStructGEP(StartFileCallArgsTy, Builder.CreateStructGEP(StartFileCallArgsTy,
StartFileCallArgsPtr, 2))}); StartFileCallArgsPtr, 2),
"stamp")});
if (auto AK = TLI->getExtAttrForI32Param(false)) if (auto AK = TLI->getExtAttrForI32Param(false))
StartFileCall->addParamAttr(2, AK); StartFileCall->addParamAttr(2, AK);
auto *NumCounters = auto *NumCounters = Builder.CreateLoad(
Builder.CreateLoad(FileInfoTy->getElementType(1), FileInfoTy->getElementType(1),
Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 1)); Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 1), "num_ctrs");
auto *EmitFunctionCallArgsArray = auto *EmitFunctionCallArgsArray =
Builder.CreateLoad(FileInfoTy->getElementType(2), Builder.CreateLoad(FileInfoTy->getElementType(2),
Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 2)); Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 2),
auto *EmitArcsCallArgsArray = "emit_function_args");
Builder.CreateLoad(FileInfoTy->getElementType(3), auto *EmitArcsCallArgsArray = Builder.CreateLoad(
Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 3)); FileInfoTy->getElementType(3),
Builder.CreateStructGEP(FileInfoTy, FileInfoPtr, 3), "emit_arcs_args");
auto *EnterCounterLoopCond = auto *EnterCounterLoopCond =
Builder.CreateICmpSLT(Builder.getInt32(0), NumCounters); Builder.CreateICmpSLT(Builder.getInt32(0), NumCounters);
Builder.CreateCondBr(EnterCounterLoopCond, CounterLoopHeader, FileLoopLatch); Builder.CreateCondBr(EnterCounterLoopCond, CounterLoopHeader, FileLoopLatch);
Builder.SetInsertPoint(CounterLoopHeader); Builder.SetInsertPoint(CounterLoopHeader);
auto *JV = Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2); auto *JV = Builder.CreatePHI(Builder.getInt32Ty(), /*NumReservedValues*/ 2,
"ctr_idx");
JV->addIncoming(Builder.getInt32(0), FileLoopHeader); JV->addIncoming(Builder.getInt32(0), FileLoopHeader);
auto *EmitFunctionCallArgsPtr = Builder.CreateInBoundsGEP( auto *EmitFunctionCallArgsPtr = Builder.CreateInBoundsGEP(
EmitFunctionCallArgsTy, EmitFunctionCallArgsArray, JV); EmitFunctionCallArgsTy, EmitFunctionCallArgsArray, JV);
@ -1189,14 +1198,16 @@ Function *GCOVProfiler::insertCounterWriteout(
EmitFunction, EmitFunction,
{Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(0), {Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(0),
Builder.CreateStructGEP(EmitFunctionCallArgsTy, Builder.CreateStructGEP(EmitFunctionCallArgsTy,
EmitFunctionCallArgsPtr, 0)), EmitFunctionCallArgsPtr, 0),
"ident"),
Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(1), Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(1),
Builder.CreateStructGEP(EmitFunctionCallArgsTy, Builder.CreateStructGEP(EmitFunctionCallArgsTy,
EmitFunctionCallArgsPtr, 1)), EmitFunctionCallArgsPtr, 1),
"func_checkssum"),
Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(2), Builder.CreateLoad(EmitFunctionCallArgsTy->getElementType(2),
Builder.CreateStructGEP(EmitFunctionCallArgsTy, Builder.CreateStructGEP(EmitFunctionCallArgsTy,
EmitFunctionCallArgsPtr, EmitFunctionCallArgsPtr, 2),
2))}); "cfg_checksum")});
if (auto AK = TLI->getExtAttrForI32Param(false)) { if (auto AK = TLI->getExtAttrForI32Param(false)) {
EmitFunctionCall->addParamAttr(0, AK); EmitFunctionCall->addParamAttr(0, AK);
EmitFunctionCall->addParamAttr(1, AK); EmitFunctionCall->addParamAttr(1, AK);
@ -1208,10 +1219,12 @@ Function *GCOVProfiler::insertCounterWriteout(
EmitArcs, EmitArcs,
{Builder.CreateLoad( {Builder.CreateLoad(
EmitArcsCallArgsTy->getElementType(0), EmitArcsCallArgsTy->getElementType(0),
Builder.CreateStructGEP(EmitArcsCallArgsTy, EmitArcsCallArgsPtr, 0)), Builder.CreateStructGEP(EmitArcsCallArgsTy, EmitArcsCallArgsPtr, 0),
Builder.CreateLoad(EmitArcsCallArgsTy->getElementType(1), "num_counters"),
Builder.CreateStructGEP(EmitArcsCallArgsTy, Builder.CreateLoad(
EmitArcsCallArgsPtr, 1))}); EmitArcsCallArgsTy->getElementType(1),
Builder.CreateStructGEP(EmitArcsCallArgsTy, EmitArcsCallArgsPtr, 1),
"counters")});
if (auto AK = TLI->getExtAttrForI32Param(false)) if (auto AK = TLI->getExtAttrForI32Param(false))
EmitArcsCall->addParamAttr(0, AK); EmitArcsCall->addParamAttr(0, AK);
auto *NextJV = Builder.CreateAdd(JV, Builder.getInt32(1)); auto *NextJV = Builder.CreateAdd(JV, Builder.getInt32(1));
@ -1222,7 +1235,7 @@ Function *GCOVProfiler::insertCounterWriteout(
Builder.SetInsertPoint(FileLoopLatch); Builder.SetInsertPoint(FileLoopLatch);
Builder.CreateCall(SummaryInfo, {}); Builder.CreateCall(SummaryInfo, {});
Builder.CreateCall(EndFile, {}); Builder.CreateCall(EndFile, {});
auto *NextIV = Builder.CreateAdd(IV, Builder.getInt32(1)); auto *NextIV = Builder.CreateAdd(IV, Builder.getInt32(1), "next_file_idx");
auto *FileLoopCond = auto *FileLoopCond =
Builder.CreateICmpSLT(NextIV, Builder.getInt32(FileInfos.size())); Builder.CreateICmpSLT(NextIV, Builder.getInt32(FileInfos.size()));
Builder.CreateCondBr(FileLoopCond, FileLoopHeader, ExitBB); Builder.CreateCondBr(FileLoopCond, FileLoopHeader, ExitBB);