forked from OSchip/llvm-project
				
			Initial checkin of function and block profiling runtime library
llvm-svn: 9546
This commit is contained in:
		
							parent
							
								
									11d1f015af
								
							
						
					
					
						commit
						fa5846a33f
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
 | 
			
		||||
llvm_start_func_profiling
 | 
			
		||||
llvm_start_block_profiling
 | 
			
		||||
		Loading…
	
		Reference in New Issue