forked from OSchip/llvm-project
				
			Add VTune as an optional external dependency and add task tracking.
llvm-svn: 178940
This commit is contained in:
		
							parent
							
								
									e9846f7f3c
								
							
						
					
					
						commit
						d4eb47c110
					
				| 
						 | 
					@ -68,6 +68,20 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
 | 
				
			||||||
"`CMakeFiles'. Please delete them.")
 | 
					"`CMakeFiles'. Please delete them.")
 | 
				
			||||||
endif()
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					list (APPEND CMAKE_MODULE_PATH "${LLD_SOURCE_DIR}/cmake/modules")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					option(LLD_USE_VTUNE
 | 
				
			||||||
 | 
					       "Enable VTune user task tracking."
 | 
				
			||||||
 | 
					       OFF)
 | 
				
			||||||
 | 
					if (LLD_USE_VTUNE)
 | 
				
			||||||
 | 
					  find_package(VTune)
 | 
				
			||||||
 | 
					  if (VTUNE_FOUND)
 | 
				
			||||||
 | 
					    include_directories(${VTune_INCLUDE_DIRS})
 | 
				
			||||||
 | 
					    list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES})
 | 
				
			||||||
 | 
					    add_definitions(-DLLD_HAS_VTUNE)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# lld requires c++11 to build. Make sure that we have a compiler and standard
 | 
					# lld requires c++11 to build. Make sure that we have a compiler and standard
 | 
				
			||||||
# library combination that can do that.
 | 
					# library combination that can do that.
 | 
				
			||||||
if (MSVC11)
 | 
					if (MSVC11)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					# - Find VTune ittnotify.
 | 
				
			||||||
 | 
					# Defines:
 | 
				
			||||||
 | 
					# VTune_FOUND
 | 
				
			||||||
 | 
					# VTune_INCLUDE_DIRS
 | 
				
			||||||
 | 
					# VTune_LIBRARIES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(dirs
 | 
				
			||||||
 | 
					  "$ENV{VTUNE_AMPLIFIER_XE_2013_DIR}/"
 | 
				
			||||||
 | 
					  "C:/Program Files (x86)/Intel/VTune Amplifier XE 2013/"
 | 
				
			||||||
 | 
					  "$ENV{VTUNE_AMPLIFIER_XE_2011_DIR}/"
 | 
				
			||||||
 | 
					  "C:/Program Files (x86)/Intel/VTune Amplifier XE 2011/"
 | 
				
			||||||
 | 
					  )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					find_path(VTune_INCLUDE_DIRS ittnotify.h
 | 
				
			||||||
 | 
					    PATHS ${dirs}
 | 
				
			||||||
 | 
					    PATH_SUFFIXES include)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (CMAKE_SIZEOF_VOID_P MATCHES "8")
 | 
				
			||||||
 | 
					  set(vtune_lib_dir lib64)
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
					  set(vtune_lib_dir lib32)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					find_library(VTune_LIBRARIES libittnotify
 | 
				
			||||||
 | 
					    HINTS "${VTune_INCLUDE_DIRS}/.."
 | 
				
			||||||
 | 
					    PATHS ${dirs}
 | 
				
			||||||
 | 
					    PATH_SUFFIXES ${vtune_lib_dir})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include(FindPackageHandleStandardArgs)
 | 
				
			||||||
 | 
					find_package_handle_standard_args(
 | 
				
			||||||
 | 
					    VTune DEFAULT_MSG VTune_LIBRARIES VTune_INCLUDE_DIRS)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,129 @@
 | 
				
			||||||
 | 
					//===- include/Core/Instrumentation.h - Instrumentation API ---------------===//
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//                             The LLVM Linker
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// This file is distributed under the University of Illinois Open Source
 | 
				
			||||||
 | 
					// License. See LICENSE.TXT for details.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// \file
 | 
				
			||||||
 | 
					/// \brief Provide an Instrumentation API that optionally uses VTune interfaces.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					//===----------------------------------------------------------------------===//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef LLD_CORE_INSTRUMENTATION_H
 | 
				
			||||||
 | 
					#define LLD_CORE_INSTRUMENTATION_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LLD_HAS_VTUNE
 | 
				
			||||||
 | 
					# include <ittnotify.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace lld {
 | 
				
			||||||
 | 
					#ifdef LLD_HAS_VTUNE
 | 
				
			||||||
 | 
					/// \brief A unique global scope for instrumentation data.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Domains last for the lifetime of the application and cannot be destroyed.
 | 
				
			||||||
 | 
					/// Multiple Domains created with the same name represent the same domain.
 | 
				
			||||||
 | 
					class Domain {
 | 
				
			||||||
 | 
					  __itt_domain *_domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  Domain(const char *name) : _domain(__itt_domain_createA(name)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  operator __itt_domain *() const { return _domain; }
 | 
				
			||||||
 | 
					  __itt_domain *operator->() const { return _domain; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// \brief A global reference to a string constant.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// These are uniqued by the ITT runtime and cannot be deleted. They are not
 | 
				
			||||||
 | 
					/// specific to a domain.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Prefer reusing a single StringHandle over passing a ntbs when the same
 | 
				
			||||||
 | 
					/// string will be used often.
 | 
				
			||||||
 | 
					class StringHandle {
 | 
				
			||||||
 | 
					  __itt_string_handle *_handle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  StringHandle(const char *name) : _handle(__itt_string_handle_createA(name)) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  operator __itt_string_handle *() const { return _handle; }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// \brief A task on a single thread. Nests within other tasks.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// Each thread has its own task stack and tasks nest recursively on that stack.
 | 
				
			||||||
 | 
					/// A task cannot transfer threads.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					/// SBRM is used to ensure task starts and ends are ballanced. The lifetime of
 | 
				
			||||||
 | 
					/// a task is either the liftime of this object, or until end is called.
 | 
				
			||||||
 | 
					class ScopedTask {
 | 
				
			||||||
 | 
					  __itt_domain *_domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ScopedTask(const ScopedTask &) LLVM_DELETED_FUNCTION;
 | 
				
			||||||
 | 
					  ScopedTask &operator=(const ScopedTask &) LLVM_DELETED_FUNCTION;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  /// \brief Create a task in Domain \p d named \p s.
 | 
				
			||||||
 | 
					  ScopedTask(const Domain &d, const StringHandle &s) : _domain(d) {
 | 
				
			||||||
 | 
					    __itt_task_begin(d, __itt_null, __itt_null, s);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ScopedTask(ScopedTask &&other) {
 | 
				
			||||||
 | 
					    *this = std::move(other);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ScopedTask &operator=(ScopedTask &&other) {
 | 
				
			||||||
 | 
					    _domain = other._domain;
 | 
				
			||||||
 | 
					    other._domain = nullptr;
 | 
				
			||||||
 | 
					    return *this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /// \brief Prematurely end this task.
 | 
				
			||||||
 | 
					  void end() {
 | 
				
			||||||
 | 
					    if (_domain)
 | 
				
			||||||
 | 
					      __itt_task_end(_domain);
 | 
				
			||||||
 | 
					    _domain = nullptr;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ~ScopedTask() { end(); }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// \brief A specific point in time. Allows metadata to be associated.
 | 
				
			||||||
 | 
					class Marker {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  Marker(const Domain &d, const StringHandle &s) {
 | 
				
			||||||
 | 
					    __itt_marker(d, __itt_null, s, __itt_scope_global);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					class Domain {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  Domain(const char *name) {}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class StringHandle {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  StringHandle(const char *name) {}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ScopedTask {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  ScopedTask(const Domain &d, const StringHandle &s) {}
 | 
				
			||||||
 | 
					  void end() {}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Marker {
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  Marker(const Domain &d, const StringHandle &s) {}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline const Domain &getDefaultDomain() {
 | 
				
			||||||
 | 
					  static Domain domain("org.llvm.lld");
 | 
				
			||||||
 | 
					  return domain;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					} // end namespace lld.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "lld/Core/PassManager.h"
 | 
					#include "lld/Core/PassManager.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "lld/Core/Instrumentation.h"
 | 
				
			||||||
#include "lld/Core/Pass.h"
 | 
					#include "lld/Core/Pass.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "llvm/Support/ErrorOr.h"
 | 
					#include "llvm/Support/ErrorOr.h"
 | 
				
			||||||
| 
						 | 
					@ -16,6 +17,7 @@
 | 
				
			||||||
namespace lld {
 | 
					namespace lld {
 | 
				
			||||||
ErrorOr<void> PassManager::runOnFile(MutableFile &mf) {
 | 
					ErrorOr<void> PassManager::runOnFile(MutableFile &mf) {
 | 
				
			||||||
  for (auto &pass : _passes) {
 | 
					  for (auto &pass : _passes) {
 | 
				
			||||||
 | 
					    ScopedTask task(getDefaultDomain(), "Pass");
 | 
				
			||||||
    pass->perform(mf);
 | 
					    pass->perform(mf);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return llvm::error_code::success();
 | 
					  return llvm::error_code::success();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,8 @@
 | 
				
			||||||
#define DEBUG_TYPE "LayoutPass"
 | 
					#define DEBUG_TYPE "LayoutPass"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "lld/Passes/LayoutPass.h"
 | 
					#include "lld/Passes/LayoutPass.h"
 | 
				
			||||||
#include "llvm/Support/Debug.h"
 | 
					
 | 
				
			||||||
 | 
					#include "lld/Core/Instrumentation.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "llvm/Support/Debug.h"
 | 
					#include "llvm/Support/Debug.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -133,6 +134,7 @@ bool LayoutPass::CompareAtoms::operator()(const DefinedAtom *left,
 | 
				
			||||||
///    targetAtom until the targetAtom has all atoms of size 0, then chain the
 | 
					///    targetAtom until the targetAtom has all atoms of size 0, then chain the
 | 
				
			||||||
///    targetAtoms and its tree to the current chain
 | 
					///    targetAtoms and its tree to the current chain
 | 
				
			||||||
void LayoutPass::buildFollowOnTable(MutableFile::DefinedAtomRange &range) {
 | 
					void LayoutPass::buildFollowOnTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
 | 
					  ScopedTask task(getDefaultDomain(), "LayoutPass::buildFollowOnTable");
 | 
				
			||||||
  for (auto ai : range) {
 | 
					  for (auto ai : range) {
 | 
				
			||||||
    for (const Reference *r : *ai) {
 | 
					    for (const Reference *r : *ai) {
 | 
				
			||||||
      if (r->kind() == lld::Reference::kindLayoutAfter) {
 | 
					      if (r->kind() == lld::Reference::kindLayoutAfter) {
 | 
				
			||||||
| 
						 | 
					@ -250,6 +252,7 @@ void LayoutPass::buildFollowOnTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
///    if not add the atom to the chain, so that the current atom is part of the
 | 
					///    if not add the atom to the chain, so that the current atom is part of the
 | 
				
			||||||
///    the chain where the rootAtom is in
 | 
					///    the chain where the rootAtom is in
 | 
				
			||||||
void LayoutPass::buildInGroupTable(MutableFile::DefinedAtomRange &range) {
 | 
					void LayoutPass::buildInGroupTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
 | 
					  ScopedTask task(getDefaultDomain(), "LayoutPass::buildInGroupTable");
 | 
				
			||||||
  // This table would convert precededby references to follow on
 | 
					  // This table would convert precededby references to follow on
 | 
				
			||||||
  // references so that we have only one table
 | 
					  // references so that we have only one table
 | 
				
			||||||
  for (auto ai : range) {
 | 
					  for (auto ai : range) {
 | 
				
			||||||
| 
						 | 
					@ -336,6 +339,7 @@ void LayoutPass::buildInGroupTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
///    same chain), chain all the atoms that are lead by the targetAtom into
 | 
					///    same chain), chain all the atoms that are lead by the targetAtom into
 | 
				
			||||||
///    the current chain
 | 
					///    the current chain
 | 
				
			||||||
void LayoutPass::buildPrecededByTable(MutableFile::DefinedAtomRange &range) {
 | 
					void LayoutPass::buildPrecededByTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
 | 
					  ScopedTask task(getDefaultDomain(), "LayoutPass::buildPrecededByTable");
 | 
				
			||||||
  // This table would convert precededby references to follow on
 | 
					  // This table would convert precededby references to follow on
 | 
				
			||||||
  // references so that we have only one table
 | 
					  // references so that we have only one table
 | 
				
			||||||
  for (auto ai : range) {
 | 
					  for (auto ai : range) {
 | 
				
			||||||
| 
						 | 
					@ -400,6 +404,7 @@ void LayoutPass::buildPrecededByTable(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
/// already assigned skip the atom and move to the next. This is the
 | 
					/// already assigned skip the atom and move to the next. This is the
 | 
				
			||||||
/// main map thats used to sort the atoms while comparing two atoms together
 | 
					/// main map thats used to sort the atoms while comparing two atoms together
 | 
				
			||||||
void LayoutPass::buildOrdinalOverrideMap(MutableFile::DefinedAtomRange &range) {
 | 
					void LayoutPass::buildOrdinalOverrideMap(MutableFile::DefinedAtomRange &range) {
 | 
				
			||||||
 | 
					  ScopedTask task(getDefaultDomain(), "LayoutPass::buildOrdinalOverrideMap");
 | 
				
			||||||
  uint64_t index = 0;
 | 
					  uint64_t index = 0;
 | 
				
			||||||
  for (auto ai : range) {
 | 
					  for (auto ai : range) {
 | 
				
			||||||
    const DefinedAtom *atom = ai;
 | 
					    const DefinedAtom *atom = ai;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue