[LLVMdev] asan coverage

Kostya Serebryany kcc at google.com
Fri Feb 21 02:57:19 PST 2014


>
>
>
> We may need some additional info.

What kind of additional info?


> I haven't put a ton of thought into
> this, but I'm hoping we can either (a) use debug info as is or add some
> extra (valid) debug info to support this, or (b) add an extra
> debug-info-like section to instrumented binaries with the information we
> need.
>

I'd try this data format (binary equivalent):

/path/to/binary/or/dso1 num_counters1
pc1 counter1
pc2 counter2
pc3 counter3
...
/path/to/binary/or/dso2 num_counters2
pc1 counter1
pc2 counter2
pc3 counter3
...

I don't see a straightforward way to produce such data today because
individual Instructions do not work as labels.
But I think this can be supported in LLVM codegen.
Here is a *raw* patch with comments, just to get the idea.


Index: lib/CodeGen/CodeGenPGO.cpp
===================================================================
--- lib/CodeGen/CodeGenPGO.cpp  (revision 201843)
+++ lib/CodeGen/CodeGenPGO.cpp  (working copy)
@@ -199,7 +199,8 @@
   llvm::Type *Args[] = {
     Int8PtrTy,                       // const char *MangledName
     Int32Ty,                         // uint32_t NumCounters
-    Int64PtrTy                       // uint64_t *Counters
+    Int64PtrTy,                       // uint64_t *Counters
+    Int64PtrTy                       // uint64_t *PCs
   };
   llvm::FunctionType *FTy =
     llvm::FunctionType::get(PGOBuilder.getVoidTy(), Args, false);
@@ -209,9 +210,10 @@
   llvm::Constant *MangledName =
     CGM.GetAddrOfConstantCString(CGM.getMangledName(GD),
"__llvm_pgo_name");
   MangledName = llvm::ConstantExpr::getBitCast(MangledName, Int8PtrTy);
-  PGOBuilder.CreateCall3(EmitFunc, MangledName,
+  PGOBuilder.CreateCall4(EmitFunc, MangledName,
                          PGOBuilder.getInt32(NumRegionCounters),
-                         PGOBuilder.CreateBitCast(RegionCounters,
Int64PtrTy));
+                         PGOBuilder.CreateBitCast(RegionCounters,
Int64PtrTy),
+                         PGOBuilder.CreateBitCast(RegionPCs, Int64PtrTy));
 }

 llvm::Function *CodeGenPGO::emitInitialization(CodeGenModule &CGM) {
@@ -769,6 +771,13 @@
                              llvm::GlobalVariable::PrivateLinkage,
                              llvm::Constant::getNullValue(CounterTy),
                              "__llvm_pgo_ctr");
+
+  RegionPCs =
+    new llvm::GlobalVariable(CGM.getModule(), CounterTy, false,
+                             llvm::GlobalVariable::PrivateLinkage,
+                             llvm::Constant::getNullValue(CounterTy),
+                             "__llvm_pgo_pcs");
+
 }

 void CodeGenPGO::emitCounterIncrement(CGBuilderTy &Builder, unsigned
Counter) {
@@ -779,6 +788,21 @@
   llvm::Value *Count = Builder.CreateLoad(Addr, "pgocount");
   Count = Builder.CreateAdd(Count, Builder.getInt64(1));
   Builder.CreateStore(Count, Addr);
+  // We should put the PC of the instruction that increments __llvm_pgo_ctr
+  // into __llvm_pgo_pcs, which will be passed to llvm_pgo_emit.
+  // This patch is wrong in many ways:
+  //   * We pass the PC of the Function instead of the PC of the
Instruction,
+  //   because the latter doesn't work like this. We'll need to support
+  //   Instructions as labels in LLVM codegen.
+  //   * We actually store the PC on each increment, while we should
initialize
+  //   this array at link time (need to refactor this code a bit).
+  //
+  Builder.CreateStore(
+      Builder.CreatePointerCast(
+          cast<llvm::Instruction>(Count)->getParent()->getParent(),
+          Builder.getInt64Ty()  // FIXME: use a better type
+          ),
+      Builder.CreateConstInBoundsGEP2_64(RegionPCs, 0, Counter));
 }

Index: lib/CodeGen/CodeGenPGO.h
===================================================================
--- lib/CodeGen/CodeGenPGO.h    (revision 201843)
+++ lib/CodeGen/CodeGenPGO.h    (working copy)
@@ -59,6 +59,7 @@

   unsigned NumRegionCounters;
   llvm::GlobalVariable *RegionCounters;
+  llvm::GlobalVariable *RegionPCs;
   llvm::DenseMap<const Stmt*, unsigned> *RegionCounterMap;
   llvm::DenseMap<const Stmt*, uint64_t> *StmtCountMap;
   std::vector<uint64_t> *RegionCounts;
@@ -66,8 +67,9 @@

 public:
   CodeGenPGO(CodeGenModule &CGM)
-    : CGM(CGM), NumRegionCounters(0), RegionCounters(0),
RegionCounterMap(0),
-      StmtCountMap(0), RegionCounts(0), CurrentRegionCount(0) {}
+      : CGM(CGM), NumRegionCounters(0), RegionCounters(0), RegionPCs(0),
+        RegionCounterMap(0), StmtCountMap(0), RegionCounts(0),
+        CurrentRegionCount(0) {}
   ~CodeGenPGO() {}

   /// Whether or not we have PGO region data for the current function.
This is
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140221/b01a08fa/attachment.html>


More information about the llvm-dev mailing list