InstrProf: Reorganize files; no functionality change
Move functions around to prepare for some other changes.
- Merge InstrProfilingExtras.h with InstrProfiling.h. There's no
benefit to having these split.
- Rename InstrProfilingExtras.c to InstrProfilingFile.c.
- Split actual buffer writing code out of InstrProfiling.c into
InstrProfilingBuffer.c.
- Drive-by corrections of a couple of header comments.
<rdar://problem/15943240>
llvm-svn: 204497
diff --git a/compiler-rt/lib/profile/InstrProfilingFile.c b/compiler-rt/lib/profile/InstrProfilingFile.c
new file mode 100644
index 0000000..505d748
--- /dev/null
+++ b/compiler-rt/lib/profile/InstrProfilingFile.c
@@ -0,0 +1,106 @@
+/*===- InstrProfilingFile.c - Write instrumentation to a file -------------===*\
+|*
+|* The LLVM Compiler Infrastructure
+|*
+|* This file is distributed under the University of Illinois Open Source
+|* License. See LICENSE.TXT for details.
+|*
+\*===----------------------------------------------------------------------===*/
+
+#include "InstrProfiling.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int writeFileWithName(const char *OutputName) {
+ int RetVal;
+ FILE *OutputFile;
+ if (!OutputName || !OutputName[0])
+ return -1;
+ OutputFile = fopen(OutputName, "w");
+ if (!OutputFile)
+ return -1;
+
+ RetVal = __llvm_profile_write_buffer(OutputFile);
+
+ fclose(OutputFile);
+ return RetVal;
+}
+
+static const char *CurrentFilename = NULL;
+void __llvm_profile_set_filename(const char *Filename) {
+ CurrentFilename = Filename;
+}
+
+int getpid(void);
+int __llvm_profile_write_file(void) {
+ char *AllocatedFilename = NULL;
+ int I, J;
+ int RetVal;
+
+#define MAX_PID_SIZE 16
+ char PidChars[MAX_PID_SIZE] = { 0 };
+ int PidLength = 0;
+ int NumPids = 0;
+
+ /* Get the filename. */
+ const char *Filename = CurrentFilename;
+#define UPDATE_FILENAME(NextFilename) \
+ if (!Filename || !Filename[0]) Filename = NextFilename
+ UPDATE_FILENAME(getenv("LLVM_PROFILE_FILE"));
+ UPDATE_FILENAME("default.profdata");
+#undef UPDATE_FILENAME
+
+ /* Check the filename for "%p", which indicates a pid-substitution. */
+ for (I = 0; Filename[I]; ++I)
+ if (Filename[I] == '%' && Filename[++I] == 'p')
+ if (!NumPids++) {
+ PidLength = snprintf(PidChars, MAX_PID_SIZE, "%d", getpid());
+ if (PidLength <= 0)
+ return -1;
+ }
+ if (NumPids) {
+ /* Allocate enough space for the substituted filename. */
+ AllocatedFilename = (char*)malloc(I + NumPids*(PidLength - 2) + 1);
+ if (!AllocatedFilename)
+ return -1;
+
+ /* Construct the new filename. */
+ for (I = 0, J = 0; Filename[I]; ++I)
+ if (Filename[I] == '%') {
+ if (Filename[++I] == 'p') {
+ memcpy(AllocatedFilename + J, PidChars, PidLength);
+ J += PidLength;
+ }
+ /* Drop any unknown substitutions. */
+ } else
+ AllocatedFilename[J++] = Filename[I];
+ AllocatedFilename[J] = 0;
+
+ /* Actually use the computed name. */
+ Filename = AllocatedFilename;
+ }
+
+ /* Write the file. */
+ RetVal = writeFileWithName(Filename);
+
+ /* Free the filename. */
+ if (AllocatedFilename)
+ free(AllocatedFilename);
+
+ return RetVal;
+}
+
+static void writeFileWithoutReturn(void) {
+ __llvm_profile_write_file();
+}
+
+int __llvm_profile_register_write_file_atexit(void) {
+ static int HasBeenRegistered = 0;
+
+ if (HasBeenRegistered)
+ return 0;
+
+ HasBeenRegistered = 1;
+ return atexit(writeFileWithoutReturn);
+}