161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===-- JIT.h - Abstract Execution Engine Interface -------------*- C++ -*-===// 261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// The LLVM Compiler Infrastructure 461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// This file is distributed under the University of Illinois Open Source 661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// License. See LICENSE.TXT for details. 761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===----------------------------------------------------------------------===// 961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 1061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// Common functionality for JITEventListener implementations 1161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 1261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===----------------------------------------------------------------------===// 1361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 1461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#ifndef EVENT_LISTENER_COMMON_H 1561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#define EVENT_LISTENER_COMMON_H 1661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 17a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/ADT/DenseMap.h" 180bcbd1df7a204e1e512f1a27066d725309de1b13Bill Wendling#include "llvm/DebugInfo.h" 190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Metadata.h" 2061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/Path.h" 21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Support/ValueHandle.h" 2261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 2361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace llvm { 2461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 2561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace jitprofiling { 2661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 2761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyclass FilenameCache { 2861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Holds the filename of each Scope, so that we can pass a null-terminated 2961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // string into oprofile. Use an AssertingVH rather than a ValueMap because we 3061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // shouldn't be modifying any MDNodes while this map is alive. 3161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DenseMap<AssertingVH<MDNode>, std::string> Filenames; 3261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DenseMap<AssertingVH<MDNode>, std::string> Paths; 3361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 3461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky public: 3561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky const char *getFilename(MDNode *Scope) { 3661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky std::string &Filename = Filenames[Scope]; 3761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Filename.empty()) { 3861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DIScope DIScope(Scope); 3961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Filename = DIScope.getFilename(); 4061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 4161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return Filename.c_str(); 4261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 4361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 4461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky const char *getFullPath(MDNode *Scope) { 4561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky std::string &P = Paths[Scope]; 4661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (P.empty()) { 4761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DIScope DIScope(Scope); 4861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky StringRef DirName = DIScope.getDirectory(); 4961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky StringRef FileName = DIScope.getFilename(); 5061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky SmallString<256> FullPath; 5161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (DirName != "." && DirName != "") { 5261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky FullPath = DirName; 5361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 5461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (FileName != "") { 5561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky sys::path::append(FullPath, FileName); 5661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 5761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky P = FullPath.str(); 5861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 5961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return P.c_str(); 6061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 6161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky}; 6261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} // namespace jitprofiling 6461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} // namespace llvm 6661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#endif //EVENT_LISTENER_COMMON_H 68