forked from llvm-mirror/llvm
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial checkin of function and block profiling runtime library
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9546 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
6 changed files
with
220 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
/*===-- BlockProfiling.c - Support library for block profiling ------------===*\ | ||
|* | ||
|* The LLVM Compiler Infrastructure | ||
|* | ||
|* This file was developed by the LLVM research group and is distributed under | ||
|* the University of Illinois Open Source License. See LICENSE.TXT for details. | ||
|* | ||
|*===----------------------------------------------------------------------===*| | ||
|* | ||
|* This file implements the call back routines for the block profiling | ||
|* instrumentation pass. This should be used with the -insert-block-profiling | ||
|* LLVM pass. | ||
|* | ||
\*===----------------------------------------------------------------------===*/ | ||
|
||
#include "Profiling.h" | ||
#include <stdlib.h> | ||
|
||
static unsigned *ArrayStart; | ||
static unsigned NumElements; | ||
|
||
/* BlockProfAtExitHandler - When the program exits, just write out the profiling | ||
* data. | ||
*/ | ||
static void BlockProfAtExitHandler() { | ||
/* Note that if this were doing something more intellegent with the | ||
instrumentation, that we could do some computation here to expand what we | ||
collected into simple block profiles. Since we directly count each block, | ||
*/ | ||
write_profiling_data(Block, ArrayStart, NumElements); | ||
} | ||
|
||
|
||
/* llvm_start_block_profiling - This is the main entry point of the block | ||
* profiling library. It is responsible for setting up the atexit handler. | ||
*/ | ||
void llvm_start_block_profiling(int argc, const char **argv, | ||
unsigned *arrayStart, unsigned numElements) { | ||
save_arguments(argc, argv); | ||
ArrayStart = arrayStart; | ||
NumElements = numElements; | ||
atexit(BlockProfAtExitHandler); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
/*===-- CommonProfiling.c - Profiling support library support -------------===*\ | ||
|* | ||
|* The LLVM Compiler Infrastructure | ||
|* | ||
|* This file was developed by the LLVM research group and is distributed under | ||
|* the University of Illinois Open Source License. See LICENSE.TXT for details. | ||
|* | ||
|*===----------------------------------------------------------------------===*| | ||
|* | ||
|* This file implements functions used by the various different types of | ||
|* profiling implementations. | ||
|* | ||
\*===----------------------------------------------------------------------===*/ | ||
|
||
#include "Profiling.h" | ||
#include <sys/types.h> | ||
#include <sys/stat.h> | ||
#include <fcntl.h> | ||
#include <stdio.h> | ||
#include <string.h> | ||
#include <unistd.h> | ||
|
||
static int SavedArgc = 0; | ||
static const char **SavedArgv = 0; | ||
|
||
/* save_arguments - Save argc and argv as passed into the program for the file | ||
* we output. | ||
*/ | ||
void save_arguments(int argc, const char **argv) { | ||
if (SavedArgv) return; /* This can be called multiple times */ | ||
|
||
/* FIXME: this should copy the arguments out of argv into a string of our own, | ||
* because the program might modify the arguments! | ||
*/ | ||
SavedArgc = argc; | ||
SavedArgv = argv; | ||
} | ||
|
||
|
||
|
||
|
||
/* write_profiling_data - Write a raw block of profiling counters out to the | ||
* llvmprof.out file. Note that we allow programs to be instrumented with | ||
* multiple different kinds of instrumentation. For this reason, this function | ||
* may be called more than once. | ||
*/ | ||
void write_profiling_data(enum ProfilingType PT, unsigned *Start, | ||
unsigned NumElements) { | ||
static int OutFile = -1; | ||
int PTy; | ||
|
||
/* If this is the first time this function is called, open the output file for | ||
* appending, creating it if it does not already exist. | ||
*/ | ||
if (OutFile == -1) { | ||
off_t Offset; | ||
OutFile = open("llvmprof.out", O_CREAT | O_WRONLY | O_APPEND, 0666); | ||
if (OutFile == -1) { | ||
perror("LLVM profiling: while opening 'llvmprof.out'"); | ||
return; | ||
} | ||
|
||
/* Output the command line arguments to the file. */ | ||
{ | ||
const char *Args = ""; | ||
int PTy = Arguments; | ||
int ArgLength = strlen(Args); | ||
int Zeros = 0; | ||
write(OutFile, &PTy, sizeof(int)); | ||
write(OutFile, &ArgLength, sizeof(int)); | ||
write(OutFile, Args, ArgLength); | ||
/* Pad out to a multiple of four bytes */ | ||
if (ArgLength & 3) | ||
write(OutFile, &Zeros, 4-(ArgLength&3)); | ||
} | ||
} | ||
|
||
/* Write out this record! */ | ||
PTy = PT; | ||
write(OutFile, &PTy, sizeof(int)); | ||
write(OutFile, Start, NumElements*sizeof(unsigned)); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
/*===-- FunctionProfiling.c - Support library for function profiling ------===*\ | ||
|* | ||
|* The LLVM Compiler Infrastructure | ||
|* | ||
|* This file was developed by the LLVM research group and is distributed under | ||
|* the University of Illinois Open Source License. See LICENSE.TXT for details. | ||
|* | ||
|*===----------------------------------------------------------------------===*| | ||
|* | ||
|* This file implements the call back routines for the function profiling | ||
|* instrumentation pass. This should be used with the | ||
|* -insert-function-profiling LLVM pass. | ||
|* | ||
\*===----------------------------------------------------------------------===*/ | ||
|
||
#include "Profiling.h" | ||
#include <stdlib.h> | ||
|
||
static unsigned *ArrayStart; | ||
static unsigned NumElements; | ||
|
||
/* FuncProfAtExitHandler - When the program exits, just write out the profiling | ||
* data. | ||
*/ | ||
static void FuncProfAtExitHandler() { | ||
/* Just write out the data we collected. | ||
*/ | ||
write_profiling_data(Function, ArrayStart, NumElements); | ||
} | ||
|
||
|
||
/* llvm_start_func_profiling - This is the main entry point of the function | ||
* profiling library. It is responsible for setting up the atexit handler. | ||
*/ | ||
void llvm_start_func_profiling(int argc, const char **argv, | ||
unsigned *arrayStart, unsigned numElements) { | ||
save_arguments(argc, argv); | ||
ArrayStart = arrayStart; | ||
NumElements = numElements; | ||
atexit(FuncProfAtExitHandler); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
##===- runtime/libprofile/Makefile -------------------------*- Makefile -*-===## | ||
# | ||
# The LLVM Compiler Infrastructure | ||
# | ||
# This file was developed by the LLVM research group and is distributed under | ||
# the University of Illinois Open Source License. See LICENSE.TXT for details. | ||
# | ||
##===----------------------------------------------------------------------===## | ||
LEVEL = ../.. | ||
BYTECODE_LIBRARY=1 | ||
SHARED_LIBRARY=1 | ||
#DONT_BUILD_RELINKED=1 | ||
LIBRARYNAME=profile_rt | ||
EXPORTED_SYMBOL_FILE = $(SourceDir)/exported_symbols.lst | ||
|
||
include $(LEVEL)/Makefile.common | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
/*===-- Profiling.h - Profiling support library support routines --*- C -*-===*\ | ||
|* | ||
|* The LLVM Compiler Infrastructure | ||
|* | ||
|* This file was developed by the LLVM research group and is distributed under | ||
|* the University of Illinois Open Source License. See LICENSE.TXT for details. | ||
|* | ||
|*===----------------------------------------------------------------------===*| | ||
|* | ||
|* This file defines functions shared by the various different profiling | ||
|* implementations. | ||
|* | ||
\*===----------------------------------------------------------------------===*/ | ||
|
||
#ifndef PROFILING_H | ||
#define PROFILING_H | ||
|
||
/* save_arguments - Save argc and argv as passed into the program for the file | ||
* we output. | ||
*/ | ||
void save_arguments(int argc, const char **argv); | ||
|
||
enum ProfilingType { | ||
Arguments = 1, /* The command line argument block */ | ||
Function = 2, /* Function profiling information */ | ||
Block = 3, /* Block profiling information */ | ||
Edge = 4, /* Edge profiling information */ | ||
Path = 5 /* Path profiling information */ | ||
}; | ||
|
||
void write_profiling_data(enum ProfilingType PT, unsigned *Start, | ||
unsigned NumElements); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
|
||
llvm_start_func_profiling | ||
llvm_start_block_profiling |