diff options
-rw-r--r-- | tools/llvm-prof/Makefile | 2 | ||||
-rw-r--r-- | tools/llvm-prof/ProfileInfo.cpp | 179 | ||||
-rw-r--r-- | tools/llvm-prof/ProfileInfo.h | 63 | ||||
-rw-r--r-- | tools/llvm-prof/llvm-prof.cpp | 5 |
4 files changed, 3 insertions, 246 deletions
diff --git a/tools/llvm-prof/Makefile b/tools/llvm-prof/Makefile index 4132e11..8c96e2b 100644 --- a/tools/llvm-prof/Makefile +++ b/tools/llvm-prof/Makefile @@ -9,5 +9,5 @@ LEVEL = ../.. TOOLNAME = llvm-prof -USEDLIBS = bcreader vmcore support.a +USEDLIBS = analysis.a bcreader vmcore support.a include $(LEVEL)/Makefile.common diff --git a/tools/llvm-prof/ProfileInfo.cpp b/tools/llvm-prof/ProfileInfo.cpp deleted file mode 100644 index 8786b30..0000000 --- a/tools/llvm-prof/ProfileInfo.cpp +++ /dev/null @@ -1,179 +0,0 @@ -//===- ProfileInfo.cpp - Represents profile information -------------------===// -// -// 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. -// -//===----------------------------------------------------------------------===// -// -// The ProfileInfo class is used to represent profiling information read in from -// the dump file. -// -//===----------------------------------------------------------------------===// - -#include "ProfileInfo.h" -#include "llvm/Module.h" -#include <cstdio> -using namespace llvm; - -enum ProfilingType { - ArgumentInfo = 1, // The command line argument block - FunctionInfo = 2, // Function profiling information - BlockInfo = 3, // Block profiling information -}; - -// ByteSwap - Byteswap 'Var' if 'Really' is true. -// -static inline unsigned ByteSwap(unsigned Var, bool Really) { - if (!Really) return Var; - return ((Var & (255<< 0)) << 24) | - ((Var & (255<< 8)) << 8) | - ((Var & (255<<16)) >> 8) | - ((Var & (255<<24)) >> 24); -} - -static void ReadProfilingBlock(const char *ToolName, FILE *F, - bool ShouldByteSwap, - std::vector<unsigned> &Data) { - // Read the number of entries... - unsigned NumEntries; - if (fread(&NumEntries, sizeof(unsigned), 1, F) != 1) { - std::cerr << ToolName << ": data packet truncated!\n"; - perror(0); - exit(1); - } - NumEntries = ByteSwap(NumEntries, ShouldByteSwap); - - // Read the counts... - std::vector<unsigned> TempSpace(NumEntries); - - // Read in the block of data... - if (fread(&TempSpace[0], sizeof(unsigned)*NumEntries, 1, F) != 1) { - std::cerr << ToolName << ": data packet truncated!\n"; - perror(0); - exit(1); - } - - // Make sure we have enough space... - if (Data.size() < NumEntries) - Data.resize(NumEntries); - - // Accumulate the data we just read into the data. - if (!ShouldByteSwap) { - for (unsigned i = 0; i != NumEntries; ++i) - Data[i] += TempSpace[i]; - } else { - for (unsigned i = 0; i != NumEntries; ++i) - Data[i] += ByteSwap(TempSpace[i], true); - } -} - -// ProfileInfo ctor - Read the specified profiling data file, exiting the -// program if the file is invalid or broken. -// -ProfileInfo::ProfileInfo(const char *ToolName, const std::string &Filename, - Module &TheModule) : M(TheModule) { - FILE *F = fopen(Filename.c_str(), "r"); - if (F == 0) { - std::cerr << ToolName << ": Error opening '" << Filename << ": "; - perror(0); - exit(1); - } - - // Keep reading packets until we run out of them. - unsigned PacketType; - while (fread(&PacketType, sizeof(unsigned), 1, F) == 1) { - // If the low eight bits of the packet are zero, we must be dealing with an - // endianness mismatch. Byteswap all words read from the profiling - // information. - bool ShouldByteSwap = (char)PacketType == 0; - PacketType = ByteSwap(PacketType, ShouldByteSwap); - - switch (PacketType) { - case ArgumentInfo: { - unsigned ArgLength; - if (fread(&ArgLength, sizeof(unsigned), 1, F) != 1) { - std::cerr << ToolName << ": arguments packet truncated!\n"; - perror(0); - exit(1); - } - ArgLength = ByteSwap(ArgLength, ShouldByteSwap); - - // Read in the arguments... - std::vector<char> Chars(ArgLength+4); - - if (ArgLength) - if (fread(&Chars[0], (ArgLength+3) & ~3, 1, F) != 1) { - std::cerr << ToolName << ": arguments packet truncated!\n"; - perror(0); - exit(1); - } - CommandLines.push_back(std::string(&Chars[0], &Chars[ArgLength])); - break; - } - - case FunctionInfo: - ReadProfilingBlock(ToolName, F, ShouldByteSwap, FunctionCounts); - break; - - case BlockInfo: - ReadProfilingBlock(ToolName, F, ShouldByteSwap, BlockCounts); - break; - - default: - std::cerr << ToolName << ": Unknown packet type #" << PacketType << "!\n"; - exit(1); - } - } - - fclose(F); -} - - -// getFunctionCounts - This method is used by consumers of function counting -// information. If we do not directly have function count information, we -// compute it from other, more refined, types of profile information. -// -void ProfileInfo::getFunctionCounts(std::vector<std::pair<Function*, - unsigned> > &Counts) { - if (FunctionCounts.empty()) { - // Synthesize function frequency information from the number of times their - // entry blocks were executed. - std::vector<std::pair<BasicBlock*, unsigned> > BlockCounts; - getBlockCounts(BlockCounts); - - for (unsigned i = 0, e = BlockCounts.size(); i != e; ++i) - if (&BlockCounts[i].first->getParent()->front() == BlockCounts[i].first) - Counts.push_back(std::make_pair(BlockCounts[i].first->getParent(), - BlockCounts[i].second)); - return; - } - - unsigned Counter = 0; - for (Module::iterator I = M.begin(), E = M.end(); - I != E && Counter != FunctionCounts.size(); ++I) - if (!I->isExternal()) - Counts.push_back(std::make_pair(I, FunctionCounts[Counter++])); -} - -// getBlockCounts - This method is used by consumers of block counting -// information. If we do not directly have block count information, we -// compute it from other, more refined, types of profile information. -// -void ProfileInfo::getBlockCounts(std::vector<std::pair<BasicBlock*, - unsigned> > &Counts) { - if (BlockCounts.empty()) { - std::cerr << "Block counts not available, and no synthesis " - << "is implemented yet!\n"; - return; - } - - unsigned Counter = 0; - for (Module::iterator F = M.begin(), E = M.end(); F != E; ++F) - for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { - Counts.push_back(std::make_pair(BB, BlockCounts[Counter++])); - if (Counter == BlockCounts.size()) - return; - } -} diff --git a/tools/llvm-prof/ProfileInfo.h b/tools/llvm-prof/ProfileInfo.h deleted file mode 100644 index db45001..0000000 --- a/tools/llvm-prof/ProfileInfo.h +++ /dev/null @@ -1,63 +0,0 @@ -//===- ProfileInfo.h - Represents profile information -----------*- 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. -// -//===----------------------------------------------------------------------===// -// -// The ProfileInfo class is used to represent profiling information read in from -// the dump file. -// -//===----------------------------------------------------------------------===// - -#ifndef PROFILEINFO_H -#define PROFILEINFO_H - -#include <vector> -#include <string> -#include <utility> - -namespace llvm { - -class Module; -class Function; -class BasicBlock; - -class ProfileInfo { - Module &M; - std::vector<std::string> CommandLines; - std::vector<unsigned> FunctionCounts; - std::vector<unsigned> BlockCounts; -public: - // ProfileInfo ctor - Read the specified profiling data file, exiting the - // program if the file is invalid or broken. - ProfileInfo(const char *ToolName, const std::string &Filename, Module &M); - - unsigned getNumExecutions() const { return CommandLines.size(); } - const std::string &getExecution(unsigned i) const { return CommandLines[i]; } - - // getFunctionCounts - This method is used by consumers of function counting - // information. If we do not directly have function count information, we - // compute it from other, more refined, types of profile information. - // - void getFunctionCounts(std::vector<std::pair<Function*, unsigned> > &Counts); - - // hasAccurateBlockCounts - Return true if we can synthesize accurate block - // frequency information from whatever we have. - // - bool hasAccurateBlockCounts() const { - return !BlockCounts.empty(); - } - - // getBlockCounts - This method is used by consumers of block counting - // information. If we do not directly have block count information, we - // compute it from other, more refined, types of profile information. - // - void getBlockCounts(std::vector<std::pair<BasicBlock*, unsigned> > &Counts); -}; - -} // End llvm namespace - -#endif diff --git a/tools/llvm-prof/llvm-prof.cpp b/tools/llvm-prof/llvm-prof.cpp index 438fecf..3c9c390 100644 --- a/tools/llvm-prof/llvm-prof.cpp +++ b/tools/llvm-prof/llvm-prof.cpp @@ -13,12 +13,11 @@ // //===----------------------------------------------------------------------===// -#include "ProfileInfo.h" #include "llvm/Module.h" #include "llvm/Assembly/AsmAnnotationWriter.h" +#include "llvm/Analysis/ProfileInfoLoader.h" #include "llvm/Bytecode/Reader.h" #include "Support/CommandLine.h" -#include <iostream> #include <cstdio> #include <map> #include <set> @@ -92,7 +91,7 @@ int main(int argc, char **argv) { } // Read the profiling information - ProfileInfo PI(argv[0], ProfileDataFile, *M); + ProfileInfoLoader PI(argv[0], ProfileDataFile, *M); std::map<const Function *, unsigned> FuncFreqs; std::map<const BasicBlock*, unsigned> BlockFreqs; |