ProfileInfoLoader.cpp revision da5ea945545ca8864a873a5a33fd891ec381ec88
1bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===- ProfileInfoLoad.cpp - Load profile information from disk -----------===// 22b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 3bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// The LLVM Compiler Infrastructure 4bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 72b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman// 8bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===----------------------------------------------------------------------===// 9bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 10bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// The ProfileInfoLoader class is used to load and represent profiling 11bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// information read in from the dump file. 12bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 13bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner//===----------------------------------------------------------------------===// 14bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 15bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include "llvm/Analysis/ProfileInfoLoader.h" 16660ef70b6292e69456239f34eaefa81fd18761fbBrian Gaeke#include "llvm/Analysis/ProfileInfoTypes.h" 17bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include "llvm/Module.h" 1801945c17398ec5f2934f4a166a231e3aea17831bChris Lattner#include "llvm/InstrTypes.h" 19a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner#include "llvm/Support/raw_ostream.h" 20bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner#include <cstdio> 21d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman#include <cstdlib> 22dbbbfef165ef730977d948e58b226e1bd8f450d4Chris Lattner#include <map> 23bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerusing namespace llvm; 24bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 25bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// ByteSwap - Byteswap 'Var' if 'Really' is true. 26bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 27bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerstatic inline unsigned ByteSwap(unsigned Var, bool Really) { 28bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (!Really) return Var; 292b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman return ((Var & (255<< 0)) << 24) | 302b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman ((Var & (255<< 8)) << 8) | 312b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman ((Var & (255<<16)) >> 8) | 32bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ((Var & (255<<24)) >> 24); 33bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 34bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 35bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattnerstatic void ReadProfilingBlock(const char *ToolName, FILE *F, 36bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner bool ShouldByteSwap, 37bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<unsigned> &Data) { 38bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read the number of entries... 39bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned NumEntries; 40bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&NumEntries, sizeof(unsigned), 1, F) != 1) { 41a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": data packet truncated!\n"; 42bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 43bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 44bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 45bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner NumEntries = ByteSwap(NumEntries, ShouldByteSwap); 46bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 47bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read the counts... 48bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<unsigned> TempSpace(NumEntries); 49bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 50bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read in the block of data... 51bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&TempSpace[0], sizeof(unsigned)*NumEntries, 1, F) != 1) { 52a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": data packet truncated!\n"; 53bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 54bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 55bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 56bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 57da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter // Make sure we have enough space... The space is initialised to -1 to 58da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter // facitiltate the loading of missing values for OptimalEdgeProfiling. 59bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (Data.size() < NumEntries) 60da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter Data.resize(NumEntries, -1); 612b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 62bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Accumulate the data we just read into the data. 63bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (!ShouldByteSwap) { 64da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter for (unsigned i = 0; i != NumEntries; ++i) { 65da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter unsigned data = TempSpace[i]; 66da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter if (data != (unsigned)-1) { // only load data if its not MissingVal 67da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter if (Data[i] == (unsigned)-1) { 68da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter Data[i] = data; // if data is still initialised 69da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } else { 70da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter Data[i] += data; 71da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 72da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 73da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 74bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } else { 75da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter for (unsigned i = 0; i != NumEntries; ++i) { 76da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter unsigned data = ByteSwap(TempSpace[i], true); 77da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter if (data != (unsigned)-1) { // only load data if its not MissingVal 78da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter if (Data[i] == (unsigned)-1) { 79da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter Data[i] = data; 80da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } else { 81da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter Data[i] += data; 82da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 83da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 84da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter } 85bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 86bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 87bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 88bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// ProfileInfoLoader ctor - Read the specified profiling data file, exiting the 89bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// program if the file is invalid or broken. 90bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner// 91bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris LattnerProfileInfoLoader::ProfileInfoLoader(const char *ToolName, 92bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner const std::string &Filename, 93ee16638bfc9c17068c4b3c2dc130277785a11e20Daniel Dunbar Module &TheModule) : 94ee16638bfc9c17068c4b3c2dc130277785a11e20Daniel Dunbar Filename(Filename), 95ee16638bfc9c17068c4b3c2dc130277785a11e20Daniel Dunbar M(TheModule), Warned(false) { 96cf48efcf3dc6c825a113448105763fab9de9aa53Andreas Neustifter FILE *F = fopen(Filename.c_str(), "rb"); 97bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (F == 0) { 98a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": Error opening '" << Filename << "': "; 99bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 100bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 101bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 102bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 103bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Keep reading packets until we run out of them. 104bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned PacketType; 105bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner while (fread(&PacketType, sizeof(unsigned), 1, F) == 1) { 106bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // If the low eight bits of the packet are zero, we must be dealing with an 107bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // endianness mismatch. Byteswap all words read from the profiling 108bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // information. 109bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner bool ShouldByteSwap = (char)PacketType == 0; 110bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner PacketType = ByteSwap(PacketType, ShouldByteSwap); 111bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 112bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner switch (PacketType) { 113bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case ArgumentInfo: { 114bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner unsigned ArgLength; 115bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&ArgLength, sizeof(unsigned), 1, F) != 1) { 116a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": arguments packet truncated!\n"; 117bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 118bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 119bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 120bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ArgLength = ByteSwap(ArgLength, ShouldByteSwap); 121bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 122bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner // Read in the arguments... 123bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner std::vector<char> Chars(ArgLength+4); 124bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 125bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (ArgLength) 126bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner if (fread(&Chars[0], (ArgLength+3) & ~3, 1, F) != 1) { 127a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": arguments packet truncated!\n"; 128bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner perror(0); 129bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 130bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 131bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner CommandLines.push_back(std::string(&Chars[0], &Chars[ArgLength])); 132bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 133bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 1342b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 135bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case FunctionInfo: 136bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, FunctionCounts); 137bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 1382b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 139bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner case BlockInfo: 140bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, BlockCounts); 141bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner break; 142bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 14301945c17398ec5f2934f4a166a231e3aea17831bChris Lattner case EdgeInfo: 14401945c17398ec5f2934f4a166a231e3aea17831bChris Lattner ReadProfilingBlock(ToolName, F, ShouldByteSwap, EdgeCounts); 14501945c17398ec5f2934f4a166a231e3aea17831bChris Lattner break; 14601945c17398ec5f2934f4a166a231e3aea17831bChris Lattner 147da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter case OptEdgeInfo: 148da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter ReadProfilingBlock(ToolName, F, ShouldByteSwap, OptimalEdgeCounts); 149da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter break; 150da5ea945545ca8864a873a5a33fd891ec381ec88Andreas Neustifter 151b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke case BBTraceInfo: 152b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke ReadProfilingBlock(ToolName, F, ShouldByteSwap, BBTrace); 153b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke break; 154b171d7949df29d4676a1c3c5e62ae0b765eee850Brian Gaeke 155bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner default: 156a81d29b3916c2eb87a17f800f3759ce21a4a96fdChris Lattner errs() << ToolName << ": Unknown packet type #" << PacketType << "!\n"; 157bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner exit(1); 158bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 159bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner } 1602b37d7cf28b1382420b5e4007042feeb66d21ac8Misha Brukman 161bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner fclose(F); 162bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner} 163bc44aa61c41277e85f1daec2740a7a12ed8e62b6Chris Lattner 164