If we have a common ToolInfo struct, maybe we can switch __esan_init to take it instead of a void* so we can do without a few of the casts.<div><br></div><div>LGTM, anyway.</div><div><br></div><div>Thank you,</div><div><br></div><div> Filipe<span></span><br><br>On Friday, 27 May 2016, Qin Zhao <<a href="mailto:zhaoqin@google.com">zhaoqin@google.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">zhaoqin updated this revision to Diff 58796.<br>
zhaoqin updated the summary for this revision.<br>
zhaoqin added a comment.<br>
<br>
Add ToolInfo and CacheFragInfo<br>
<br>
<br>
<a href="http://reviews.llvm.org/D20542" target="_blank">http://reviews.llvm.org/D20542</a><br>
<br>
Files:<br>
  lib/esan/cache_frag.cpp<br>
  lib/esan/esan.cpp<br>
  test/esan/TestCases/struct-simple.cpp<br>
<br>
Index: test/esan/TestCases/struct-simple.cpp<br>
===================================================================<br>
--- test/esan/TestCases/struct-simple.cpp<br>
+++ test/esan/TestCases/struct-simple.cpp<br>
@@ -27,18 +27,18 @@<br>
 int main(int argc, char **argv) {<br>
   // CHECK:      in esan::initializeLibrary<br>
   // CHECK:      in esan::initializeCacheFrag<br>
-  // CHECK-NEXT: in esan::processCompilationUnitInit<br>
-  // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit<br>
-  // CHECK-NEXT: in esan::processCompilationUnitInit<br>
-  // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit<br>
+  // CHECK-NEXT: in esan::processCompilationUnitInit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCompilationUnitInit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCacheFragCompilationUnitInit: {{.*}}struct-simple.cpp<br>
   part();<br>
   return 0;<br>
   // CHECK:      in esan::finalizeLibrary<br>
   // CHECK-NEXT: in esan::finalizeCacheFrag<br>
   // CHECK-NEXT: {{.*}}EfficiencySanitizer is not finished: nothing yet to report<br>
-  // CHECK-NEXT: in esan::processCompilationUnitExit<br>
-  // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit<br>
-  // CHECK-NEXT: in esan::processCompilationUnitExit<br>
-  // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit<br>
+  // CHECK-NEXT: in esan::processCompilationUnitExit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCompilationUnitExit: {{.*}}struct-simple.cpp<br>
+  // CHECK-NEXT: in esan::processCacheFragCompilationUnitExit: {{.*}}struct-simple.cpp<br>
 }<br>
 #endif // MAIN<br>
Index: lib/esan/esan.cpp<br>
===================================================================<br>
--- lib/esan/esan.cpp<br>
+++ lib/esan/esan.cpp<br>
@@ -194,17 +194,26 @@<br>
   return 0;<br>
 }<br>
<br>
+// Struct with general tool information passed to the runtime.<br>
+// This structure should be kept consistent with the LLVM's EfficiencySanitizer<br>
+// ToolInfo.<br>
+struct ToolInfo {<br>
+  const char *UnitName;<br>
+};<br>
+<br>
 void processCompilationUnitInit(void *Ptr) {<br>
-  VPrintf(2, "in esan::%s\n", __FUNCTION__);<br>
+  ToolInfo *Info = (ToolInfo *)Ptr;<br>
+  VPrintf(2, "in esan::%s: %s\n", __FUNCTION__, Info->UnitName);<br>
   if (WhichTool == ESAN_CacheFrag) {<br>
     processCacheFragCompilationUnitInit(Ptr);<br>
   }<br>
 }<br>
<br>
 // This is called when the containing module is unloaded.<br>
 // For the main executable module, this is called after finalizeLibrary.<br>
 void processCompilationUnitExit(void *Ptr) {<br>
-  VPrintf(2, "in esan::%s\n", __FUNCTION__);<br>
+  ToolInfo *Info = (ToolInfo *)Ptr;<br>
+  VPrintf(2, "in esan::%s: %s\n", __FUNCTION__, Info->UnitName);<br>
   if (WhichTool == ESAN_CacheFrag) {<br>
     processCacheFragCompilationUnitExit(Ptr);<br>
   }<br>
Index: lib/esan/cache_frag.cpp<br>
===================================================================<br>
--- lib/esan/cache_frag.cpp<br>
+++ lib/esan/cache_frag.cpp<br>
@@ -16,14 +16,22 @@<br>
<br>
 namespace __esan {<br>
<br>
+// This should be kept consistent with LLVM's EfficiencySanitizer CacheFragInfo.<br>
+// The tool-specific information per compilation unit (module).<br>
+struct CacheFragInfo {<br>
+  const char *UnitName;<br>
+};<br>
+<br>
 //===-- Init/exit functions -----------------------------------------------===//<br>
<br>
 void processCacheFragCompilationUnitInit(void *Ptr) {<br>
-  VPrintf(2, "in esan::%s\n", __FUNCTION__);<br>
+  CacheFragInfo *CFI = (CacheFragInfo *)Ptr;<br>
+  VPrintf(2, "in esan::%s: %s\n", __FUNCTION__, CFI->UnitName);<br>
 }<br>
<br>
 void processCacheFragCompilationUnitExit(void *Ptr) {<br>
-  VPrintf(2, "in esan::%s\n", __FUNCTION__);<br>
+  CacheFragInfo *CFI = (CacheFragInfo *)Ptr;<br>
+  VPrintf(2, "in esan::%s: %s\n", __FUNCTION__, CFI->UnitName);<br>
 }<br>
<br>
 void initializeCacheFrag() {<br>
<br>
<br>
</blockquote></div>