[compiler-rt] r204268 - PGO: Splitting implementation files; no functionality change

Duncan P. N. Exon Smith dexonsmith at apple.com
Wed Mar 19 15:10:27 PDT 2014


Author: dexonsmith
Date: Wed Mar 19 17:10:27 2014
New Revision: 204268

URL: http://llvm.org/viewvc/llvm-project?rev=204268&view=rev
Log:
PGO: Splitting implementation files; no functionality change

Split implementation files along a uses-libc/shouldn't-use-libc
boundary.

  - InstrProfiling.h is a shared header.

  - InstrProfiling.c provides an API to extract profiling data from the
    runtime, but avoids the use of libc.  Currently this is a lie:
    __llvm_pgo_write_buffer() uses `FILE*` and related functions.  It
    will be updated soon to write to a `char*` buffer instead.

  - InstrProfilingExtras.c provides a more convenient API for
    interfacing with the profiling runtime, but has logic that does (and
    will continue to) use libc.

<rdar://problem/15943240>

Added:
    compiler-rt/trunk/lib/profile/InstrProfiling.c
    compiler-rt/trunk/lib/profile/InstrProfiling.h
    compiler-rt/trunk/lib/profile/InstrProfilingExtras.c
Removed:
    compiler-rt/trunk/lib/profile/PGOProfiling.c
Modified:
    compiler-rt/trunk/lib/profile/CMakeLists.txt

Modified: compiler-rt/trunk/lib/profile/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/CMakeLists.txt?rev=204268&r1=204267&r2=204268&view=diff
==============================================================================
--- compiler-rt/trunk/lib/profile/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/profile/CMakeLists.txt Wed Mar 19 17:10:27 2014
@@ -1,6 +1,7 @@
 set(PROFILE_SOURCES
   GCDAProfiling.c
-  PGOProfiling.c)
+  InstrProfiling.c
+  InstrProfilingExtras.c)
 
 filter_available_targets(PROFILE_SUPPORTED_ARCH x86_64 i386 arm)
 

Added: compiler-rt/trunk/lib/profile/InstrProfiling.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.c?rev=204268&view=auto
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfiling.c (added)
+++ compiler-rt/trunk/lib/profile/InstrProfiling.c Wed Mar 19 17:10:27 2014
@@ -0,0 +1,70 @@
+/*===- InstrProfiling.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 "InstrProfiling.h"
+
+/* TODO: Calculate these with linker magic. */
+static __llvm_pgo_data *First = NULL;
+static __llvm_pgo_data *Final = NULL;
+
+/*!
+ * \brief Register an instrumented function.
+ *
+ * Calls to this are emitted by clang with -fprofile-instr-generate.  Such
+ * calls are only required (and only emitted) on targets where we haven't
+ * implemented linker magic to find the bounds of the section.
+ *
+ * For now, that's all targets.
+ */
+void __llvm_pgo_register_function(void *Data_) {
+  /* TODO: Only emit this function if we can't use linker magic. */
+  __llvm_pgo_data *Data = (__llvm_pgo_data*)Data_;
+  if (!First || Data < First)
+    First = Data;
+  if (!Final || Data > Final)
+    Final = Data;
+}
+
+/*! \brief Get the first instrumentation record. */
+static __llvm_pgo_data *getFirst() {
+  /* TODO: Use extern + linker magic instead of a static variable. */
+  return First;
+}
+
+/*! \brief Get the last instrumentation record. */
+static __llvm_pgo_data *getLast() {
+  /* TODO: Use extern + linker magic instead of a static variable. */
+  return Final + 1;
+}
+
+/* TODO: void __llvm_pgo_get_size_for_buffer(void);  */
+
+static void writeFunction(FILE *OutputFile, const __llvm_pgo_data *Data) {
+  /* TODO: Requires libc: break requirement by writing directly to a buffer
+   * instead of a FILE stream.
+   */
+  uint32_t I;
+  for (I = 0; I < Data->NameSize; ++I)
+    fputc(Data->Name[I], OutputFile);
+  fprintf(OutputFile, "\n%" PRIu64 "\n%u\n", Data->FuncHash, Data->NumCounters);
+  for (I = 0; I < Data->NumCounters; ++I)
+    fprintf(OutputFile, "%" PRIu64 "\n", Data->Counters[I]);
+  fprintf(OutputFile, "\n");
+}
+
+void __llvm_pgo_write_buffer(FILE *OutputFile) {
+  /* TODO: Requires libc: break requirement by taking a char* buffer instead of
+   * a FILE stream.
+   */
+  __llvm_pgo_data *I, *E;
+
+  for (I = getFirst(), E = getLast(); I != E; ++I)
+    writeFunction(OutputFile, I);
+}
+

Added: compiler-rt/trunk/lib/profile/InstrProfiling.h
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfiling.h?rev=204268&view=auto
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfiling.h (added)
+++ compiler-rt/trunk/lib/profile/InstrProfiling.h Wed Mar 19 17:10:27 2014
@@ -0,0 +1,52 @@
+/*===- InstrProfiling.h- 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>
+
+#define I386_FREEBSD (defined(__FreeBSD__) && defined(__i386__))
+
+#if !I386_FREEBSD
+#include <inttypes.h>
+#endif
+
+#if !defined(_MSC_VER) && !I386_FREEBSD
+#include <stdint.h>
+#endif
+
+#if defined(_MSC_VER)
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+#elif I386_FREEBSD
+/* System headers define 'size_t' incorrectly on x64 FreeBSD (prior to
+ * FreeBSD 10, r232261) when compiled in 32-bit mode.
+ */
+#define PRIu64 "llu"
+typedef unsigned int uint32_t;
+typedef unsigned long long uint64_t;
+#endif
+
+typedef struct __llvm_pgo_data {
+  const uint32_t NameSize;
+  const uint32_t NumCounters;
+  const uint64_t FuncHash;
+  const char *const Name;
+  const uint64_t *const Counters;
+} __llvm_pgo_data;
+
+/* TODO: void __llvm_pgo_get_size_for_buffer(void);  */
+
+/*!
+ * \brief Write instrumentation data to the given buffer.
+ *
+ * This function is currently broken:  it shouldn't rely on libc, but it does.
+ * It should be changed to take a char* buffer, and write binary data directly
+ * to it.
+ */
+void __llvm_pgo_write_buffer(FILE *OutputFile);

Added: compiler-rt/trunk/lib/profile/InstrProfilingExtras.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/InstrProfilingExtras.c?rev=204268&view=auto
==============================================================================
--- compiler-rt/trunk/lib/profile/InstrProfilingExtras.c (added)
+++ compiler-rt/trunk/lib/profile/InstrProfilingExtras.c Wed Mar 19 17:10:27 2014
@@ -0,0 +1,49 @@
+/*===- InstrProfilingExtras.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 "InstrProfiling.h"
+
+/*! \brief Write instrumentation data to the given file. */
+void __llvm_pgo_write_file(const char *OutputName) {
+  /* TODO: Requires libc: move to separate translation unit. */
+  FILE *OutputFile;
+  if (!OutputName || !OutputName[0])
+    return;
+  OutputFile = fopen(OutputName, "w");
+  if (!OutputFile) return;
+
+  /* TODO: mmap file to buffer of size __llvm_pgo_get_size_for_buffer() and
+   * pass the buffer in, instead of the file.
+   */
+  __llvm_pgo_write_buffer(OutputFile);
+
+  fclose(OutputFile);
+}
+
+/*! \brief Write instrumentation data to the default file. */
+void __llvm_pgo_write_default_file() {
+  /* TODO: Requires libc: move to separate translation unit. */
+  const char *OutputName = getenv("LLVM_PROFILE_FILE");
+  if (OutputName == NULL || OutputName[0] == '\0')
+    OutputName = "default.profdata";
+  __llvm_pgo_write_file(OutputName);
+}
+
+/*!
+ * \brief Register to write instrumentation data to the default file at exit.
+ */
+void __llvm_pgo_register_write_atexit() {
+  /* TODO: Requires libc: move to separate translation unit. */
+  static int HasBeenRegistered = 0;
+
+  if (!HasBeenRegistered) {
+    HasBeenRegistered = 1;
+    atexit(__llvm_pgo_write_default_file);
+  }
+}

Removed: compiler-rt/trunk/lib/profile/PGOProfiling.c
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/profile/PGOProfiling.c?rev=204267&view=auto
==============================================================================
--- compiler-rt/trunk/lib/profile/PGOProfiling.c (original)
+++ compiler-rt/trunk/lib/profile/PGOProfiling.c (removed)
@@ -1,131 +0,0 @@
-/*===- 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>
-
-#define I386_FREEBSD (defined(__FreeBSD__) && defined(__i386__))
-
-#if !I386_FREEBSD
-#include <inttypes.h>
-#endif
-
-#if !defined(_MSC_VER) && !I386_FREEBSD
-#include <stdint.h>
-#endif
-
-#if defined(_MSC_VER)
-typedef unsigned int uint32_t;
-typedef unsigned long long uint64_t;
-#elif I386_FREEBSD
-/* System headers define 'size_t' incorrectly on x64 FreeBSD (prior to
- * FreeBSD 10, r232261) when compiled in 32-bit mode.
- */
-#define PRIu64 "llu"
-typedef unsigned int uint32_t;
-typedef unsigned long long uint64_t;
-#endif
-
-typedef struct __llvm_pgo_data {
-  const uint32_t NameSize;
-  const uint32_t NumCounters;
-  const uint64_t FuncHash;
-  const char *const Name;
-  const uint64_t *const Counters;
-} __llvm_pgo_data;
-
-/* TODO: Calculate these with linker magic. */
-static __llvm_pgo_data *First = NULL;
-static __llvm_pgo_data *Final = NULL;
-/*!
- * \brief Register an instrumented function.
- *
- * Calls to this are emitted by clang with -fprofile-instr-generate.  Such
- * calls are only required (and only emitted) on targets where we haven't
- * implemented linker magic to find the bounds of the section.
- *
- * For now, that's all targets.
- */
-void __llvm_pgo_register_function(void *Data_) {
-  /* TODO: Only emit this function if we can't use linker magic. */
-  __llvm_pgo_data *Data = (__llvm_pgo_data*)Data_;
-  if (!First || Data < First)
-    First = Data;
-  if (!Final || Data > Final)
-    Final = Data;
-}
-
-/*! \brief Get the first instrumentation record. */
-static __llvm_pgo_data *getFirst() {
-  /* TODO: Use extern + linker magic instead of a static variable. */
-  return First;
-}
-
-/*! \brief Get the last instrumentation record. */
-static __llvm_pgo_data *getLast() {
-  /* TODO: Use extern + linker magic instead of a static variable. */
-  return Final + 1;
-}
-
-/* TODO: void __llvm_pgo_get_size_for_buffer(void);  */
-/* TODO: void __llvm_pgo_write_buffer(char *Buffer); */
-
-static void writeFunction(FILE *OutputFile, const __llvm_pgo_data *Data) {
-  /* TODO: Requires libc: break requirement by writing directly to a buffer
-   * instead of a FILE stream.
-   */
-  uint32_t I;
-  for (I = 0; I < Data->NameSize; ++I)
-    fputc(Data->Name[I], OutputFile);
-  fprintf(OutputFile, "\n%" PRIu64 "\n%u\n", Data->FuncHash, Data->NumCounters);
-  for (I = 0; I < Data->NumCounters; ++I)
-    fprintf(OutputFile, "%" PRIu64 "\n", Data->Counters[I]);
-  fprintf(OutputFile, "\n");
-}
-
-/*! \brief Write instrumentation data to the given file. */
-void __llvm_pgo_write_file(const char *OutputName) {
-  /* TODO: Requires libc: move to separate translation unit. */
-  __llvm_pgo_data *I, *E;
-  FILE *OutputFile;
-  if (!OutputName || !OutputName[0])
-    return;
-  OutputFile = fopen(OutputName, "w");
-  if (!OutputFile) return;
-
-  /* TODO: mmap file to buffer of size __llvm_pgo_get_size_for_buffer() and
-   * call __llvm_pgo_write_buffer().
-   */
-  for (I = getFirst(), E = getLast(); I != E; ++I)
-    writeFunction(OutputFile, I);
-
-  fclose(OutputFile);
-}
-
-/*! \brief Write instrumentation data to the default file. */
-void __llvm_pgo_write_default_file() {
-  /* TODO: Requires libc: move to separate translation unit. */
-  const char *OutputName = getenv("LLVM_PROFILE_FILE");
-  if (OutputName == NULL || OutputName[0] == '\0')
-    OutputName = "default.profdata";
-  __llvm_pgo_write_file(OutputName);
-}
-
-/*!
- * \brief Register to write instrumentation data to the default file at exit.
- */
-void __llvm_pgo_register_write_atexit() {
-  /* TODO: Requires libc: move to separate translation unit. */
-  static int HasBeenRegistered = 0;
-
-  if (!HasBeenRegistered) {
-    HasBeenRegistered = 1;
-    atexit(__llvm_pgo_write_default_file);
-  }
-}





More information about the llvm-commits mailing list