1234285Sdim//===-- JIT.h - Abstract Execution Engine Interface -------------*- C++ -*-===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// Common functionality for JITEventListener implementations 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14234285Sdim#ifndef EVENT_LISTENER_COMMON_H 15234285Sdim#define EVENT_LISTENER_COMMON_H 16234285Sdim 17249423Sdim#include "llvm/ADT/DenseMap.h" 18239462Sdim#include "llvm/DebugInfo.h" 19249423Sdim#include "llvm/IR/Metadata.h" 20249423Sdim#include "llvm/Support/Path.h" 21234285Sdim#include "llvm/Support/ValueHandle.h" 22234285Sdim 23234285Sdimnamespace llvm { 24234285Sdim 25234285Sdimnamespace jitprofiling { 26234285Sdim 27234285Sdimclass FilenameCache { 28234285Sdim // Holds the filename of each Scope, so that we can pass a null-terminated 29234285Sdim // string into oprofile. Use an AssertingVH rather than a ValueMap because we 30234285Sdim // shouldn't be modifying any MDNodes while this map is alive. 31234285Sdim DenseMap<AssertingVH<MDNode>, std::string> Filenames; 32234285Sdim DenseMap<AssertingVH<MDNode>, std::string> Paths; 33234285Sdim 34234285Sdim public: 35234285Sdim const char *getFilename(MDNode *Scope) { 36234285Sdim std::string &Filename = Filenames[Scope]; 37234285Sdim if (Filename.empty()) { 38234285Sdim DIScope DIScope(Scope); 39234285Sdim Filename = DIScope.getFilename(); 40234285Sdim } 41234285Sdim return Filename.c_str(); 42234285Sdim } 43234285Sdim 44234285Sdim const char *getFullPath(MDNode *Scope) { 45234285Sdim std::string &P = Paths[Scope]; 46234285Sdim if (P.empty()) { 47234285Sdim DIScope DIScope(Scope); 48234285Sdim StringRef DirName = DIScope.getDirectory(); 49234285Sdim StringRef FileName = DIScope.getFilename(); 50234285Sdim SmallString<256> FullPath; 51234285Sdim if (DirName != "." && DirName != "") { 52234285Sdim FullPath = DirName; 53234285Sdim } 54234285Sdim if (FileName != "") { 55234285Sdim sys::path::append(FullPath, FileName); 56234285Sdim } 57234285Sdim P = FullPath.str(); 58234285Sdim } 59234285Sdim return P.c_str(); 60234285Sdim } 61234285Sdim}; 62234285Sdim 63234285Sdim} // namespace jitprofiling 64234285Sdim 65234285Sdim} // namespace llvm 66234285Sdim 67234285Sdim#endif //EVENT_LISTENER_COMMON_H 68