[compiler-rt] r198638 - profile: Rudimentary suppport for PGO instrumentation

Justin Bogner mail at justinbogner.com
Mon Jan 6 14:27:03 PST 2014


Author: bogner
Date: Mon Jan  6 16:27:03 2014
New Revision: 198638

URL: http://llvm.org/viewvc/llvm-project?rev=198638&view=rev
Log:
profile: Rudimentary suppport for PGO instrumentation

This is fairly minimal support for instrumentation based PGO. The data
format is inefficient, and the output file name is hardcoded to
pgo-data.

Added:
    compiler-rt/trunk/lib/profile/PGOProfiling.c
Modified:
    compiler-rt/trunk/lib/profile/CMakeLists.txt
    compiler-rt/trunk/make/platform/clang_darwin.mk

Modified: compiler-rt/trunk/lib/profile/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/CMakeLists.txt?rev=198638&r1=198637&r2=198638&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/profile/CMakeLists.txt Mon Jan  6 16:27:03 2014
@@ -1,5 +1,6 @@
 set(PROFILE_SOURCES
-  GCDAProfiling.c)
+  GCDAProfiling.c
+  PGOProfiling.c)
 
 filter_available_targets(PROFILE_SUPPORTED_ARCH x86_64 i386)
 

Added: compiler-rt/trunk/lib/profile/PGOProfiling.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/PGOProfiling.c?rev=198638&view=auto
==============================================================================
--- compiler-rt/trunk/lib/profile/PGOProfiling.c (added)
+++ compiler-rt/trunk/lib/profile/PGOProfiling.c Mon Jan  6 16:27:03 2014
@@ -0,0 +1,81 @@
+/*===- PGOProfiling.c - Support library for PGO instrumentation -----------===*\
+|*
+|*                     The LLVM Compiler Infrastructure
+|*
+|* This file is distributed under the University of Illinois Open Source
+|* License. See LICENSE.TXT for details.
+|*
+\*===----------------------------------------------------------------------===*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifndef _MSC_VER
+#include <stdint.h>
+#else
+typedef unsigned int uint32_t;
+typedef unsigned int uint64_t;
+#endif
+
+static FILE *OutputFile = NULL;
+
+/*
+ * A list of functions to write out the data.
+ */
+typedef void (*writeout_fn)();
+
+struct writeout_fn_node {
+  writeout_fn fn;
+  struct writeout_fn_node *next;
+};
+
+static struct writeout_fn_node *writeout_fn_head = NULL;
+static struct writeout_fn_node *writeout_fn_tail = NULL;
+
+void llvm_pgo_emit(const char *MangledName, uint32_t NumCounters,
+                   uint64_t *Counters) {
+  uint32_t i;
+  fprintf(OutputFile, "%s %u\n", MangledName, NumCounters);
+  for (i = 0; i < NumCounters; ++i)
+    fprintf(OutputFile, "%llu\n", Counters[i]);
+  fprintf(OutputFile, "\n");
+}
+
+void llvm_pgo_register_writeout_function(writeout_fn fn) {
+  struct writeout_fn_node *new_node = malloc(sizeof(struct writeout_fn_node));
+  new_node->fn = fn;
+  new_node->next = NULL;
+
+  if (!writeout_fn_head) {
+    writeout_fn_head = writeout_fn_tail = new_node;
+  } else {
+    writeout_fn_tail->next = new_node;
+    writeout_fn_tail = new_node;
+  }
+}
+
+void llvm_pgo_writeout_files() {
+  OutputFile = fopen("pgo-data", "w");
+  if (!OutputFile) return;
+
+  while (writeout_fn_head) {
+    struct writeout_fn_node *node = writeout_fn_head;
+    writeout_fn_head = writeout_fn_head->next;
+    node->fn();
+    free(node);
+  }
+
+  fclose(OutputFile);
+}
+
+void llvm_pgo_init(writeout_fn wfn) {
+  static int atexit_ran = 0;
+
+  if (wfn)
+    llvm_pgo_register_writeout_function(wfn);
+
+  if (atexit_ran == 0) {
+    atexit_ran = 1;
+    atexit(llvm_pgo_writeout_files);
+  }
+}

Modified: compiler-rt/trunk/make/platform/clang_darwin.mk
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/make/platform/clang_darwin.mk?rev=198638&r1=198637&r2=198638&view=diff
==============================================================================
--- compiler-rt/trunk/make/platform/clang_darwin.mk (original)
+++ compiler-rt/trunk/make/platform/clang_darwin.mk Mon Jan  6 16:27:03 2014
@@ -214,8 +214,8 @@ FUNCTIONS.ios.x86_64 := $(FUNCTIONS.ios)
 
 FUNCTIONS.osx	:= mulosi4 mulodi4 muloti4
 
-FUNCTIONS.profile_osx := GCDAProfiling
-FUNCTIONS.profile_ios := GCDAProfiling
+FUNCTIONS.profile_osx := GCDAProfiling PGOProfiling
+FUNCTIONS.profile_ios := GCDAProfiling PGOProfiling
 
 FUNCTIONS.asan_osx_dynamic := $(AsanFunctions) $(InterceptionFunctions) \
                               $(SanitizerCommonFunctions) \





More information about the llvm-commits mailing list