18e6b2974327c733edf267e971ce5f8982421a888Daniel Malea//===- llvm/Transforms/Instrumentation/DebugIR.h - Interface ----*- C++ -*-===// 28e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// 38e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// The LLVM Compiler Infrastructure 48e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// 58e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// This file is distributed under the University of Illinois Open Source 68e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// License. See LICENSE.TXT for details. 78e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// 88e6b2974327c733edf267e971ce5f8982421a888Daniel Malea//===----------------------------------------------------------------------===// 98e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// 108e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// This file defines the interface of the DebugIR pass. For most users, 118e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// including Instrumentation.h and calling createDebugIRPass() is sufficient and 128e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// there is no need to include this file. 138e6b2974327c733edf267e971ce5f8982421a888Daniel Malea// 148e6b2974327c733edf267e971ce5f8982421a888Daniel Malea//===----------------------------------------------------------------------===// 158e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 168e6b2974327c733edf267e971ce5f8982421a888Daniel Malea#ifndef LLVM_TRANSFORMS_INSTRUMENTATION_DEBUGIR_H 178e6b2974327c733edf267e971ce5f8982421a888Daniel Malea#define LLVM_TRANSFORMS_INSTRUMENTATION_DEBUGIR_H 188e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 198e6b2974327c733edf267e971ce5f8982421a888Daniel Malea#include "llvm/Pass.h" 208e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 218e6b2974327c733edf267e971ce5f8982421a888Daniel Maleanamespace llvm { 228e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 238e6b2974327c733edf267e971ce5f8982421a888Daniel Maleaclass DebugIR : public llvm::ModulePass { 248e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// If true, write a source file to disk. 258e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool WriteSourceToDisk; 268e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 278e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Hide certain (non-essential) debug information (only relevant if 288e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// createSource is true. 298e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool HideDebugIntrinsics; 308e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool HideDebugMetadata; 318e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 328e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// The location of the source file. 338e6b2974327c733edf267e971ce5f8982421a888Daniel Malea std::string Directory; 348e6b2974327c733edf267e971ce5f8982421a888Daniel Malea std::string Filename; 358e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 368e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// True if a temporary file name was generated. 378e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool GeneratedPath; 388e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 398e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// True if the file name was read from the Module. 408e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool ParsedPath; 418e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 428e6b2974327c733edf267e971ce5f8982421a888Daniel Maleapublic: 438e6b2974327c733edf267e971ce5f8982421a888Daniel Malea static char ID; 448e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const char *getPassName() const override { return "DebugIR"; } 468e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 478e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Generate a file on disk to be displayed in a debugger. If Filename and 488e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Directory are empty, a temporary path will be generated. 498e6b2974327c733edf267e971ce5f8982421a888Daniel Malea DebugIR(bool HideDebugIntrinsics, bool HideDebugMetadata, 508e6b2974327c733edf267e971ce5f8982421a888Daniel Malea llvm::StringRef Directory, llvm::StringRef Filename) 518e6b2974327c733edf267e971ce5f8982421a888Daniel Malea : ModulePass(ID), WriteSourceToDisk(true), 528e6b2974327c733edf267e971ce5f8982421a888Daniel Malea HideDebugIntrinsics(HideDebugIntrinsics), 538e6b2974327c733edf267e971ce5f8982421a888Daniel Malea HideDebugMetadata(HideDebugMetadata), Directory(Directory), 548e6b2974327c733edf267e971ce5f8982421a888Daniel Malea Filename(Filename), GeneratedPath(false), ParsedPath(false) {} 558e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 568e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Modify input in-place; do not generate additional files, and do not hide 578e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// any debug intrinsics/metadata that might be present. 588e6b2974327c733edf267e971ce5f8982421a888Daniel Malea DebugIR() 598e6b2974327c733edf267e971ce5f8982421a888Daniel Malea : ModulePass(ID), WriteSourceToDisk(false), HideDebugIntrinsics(false), 608e6b2974327c733edf267e971ce5f8982421a888Daniel Malea HideDebugMetadata(false), GeneratedPath(false), ParsedPath(false) {} 618e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 628e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Run pass on M and set Path to the source file path in the output module. 638e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool runOnModule(llvm::Module &M, std::string &Path); 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnModule(llvm::Module &M) override; 658e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 668e6b2974327c733edf267e971ce5f8982421a888Daniel Maleaprivate: 678e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 688e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Returns the concatenated Directory + Filename, without error checking 698e6b2974327c733edf267e971ce5f8982421a888Daniel Malea std::string getPath(); 708e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 718e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Attempts to read source information from debug information in M, and if 728e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// that fails, from M's identifier. Returns true on success, false otherwise. 738e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool getSourceInfo(const llvm::Module &M); 748e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 758e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Replace the extension of Filename with NewExtension, and return true if 768e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// successful. Return false if extension could not be found or Filename is 778e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// empty. 788e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool updateExtension(llvm::StringRef NewExtension); 798e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 808e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Generate a temporary filename and open an fd 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void generateFilename(std::unique_ptr<int> &fd); 828e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 838e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Creates DWARF CU/Subroutine metadata 848e6b2974327c733edf267e971ce5f8982421a888Daniel Malea void createDebugInfo(llvm::Module &M, 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::unique_ptr<llvm::Module> &DisplayM); 868e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 878e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Returns true if either Directory or Filename is missing, false otherwise. 888e6b2974327c733edf267e971ce5f8982421a888Daniel Malea bool isMissingPath(); 898e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 908e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// Write M to disk, optionally passing in an fd to an open file which is 918e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// closed by this function after writing. If no fd is specified, a new file 928e6b2974327c733edf267e971ce5f8982421a888Daniel Malea /// is opened, written, and closed. 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void writeDebugBitcode(const llvm::Module *M, int *fd = nullptr); 948e6b2974327c733edf267e971ce5f8982421a888Daniel Malea}; 958e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 968e6b2974327c733edf267e971ce5f8982421a888Daniel Malea} // llvm namespace 978e6b2974327c733edf267e971ce5f8982421a888Daniel Malea 988e6b2974327c733edf267e971ce5f8982421a888Daniel Malea#endif // LLVM_TRANSFORMS_INSTRUMENTATION_DEBUGIR_H 99