11e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 21e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 31e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsLicensed under the Apache License, Version 2.0 (the "License"); 41e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsyou may not use this file except in compliance with the License. 51e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsYou may obtain a copy of the License at 61e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 71e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins http://www.apache.org/licenses/LICENSE-2.0 81e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 91e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsUnless required by applicable law or agreed to in writing, software 101e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsdistributed under the License is distributed on an "AS IS" BASIS, 111e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e67c90e2caceeff82d09793d1ef5fa0300d219bPeter HawkinsSee the License for the specific language governing permissions and 131e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinslimitations under the License. 141e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins==============================================================================*/ 151e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 161e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#ifndef TENSORFLOW_COMPILER_XLA_SERVICE_CPU_DISASSEMBLER_H_ 171e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#define TENSORFLOW_COMPILER_XLA_SERVICE_CPU_DISASSEMBLER_H_ 181e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 191e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include <memory> 201e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include <string> 211e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 2234cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCContext.h" 2334cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCDisassembler/MCDisassembler.h" 2434cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCInstPrinter.h" 2534cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCInstrAnalysis.h" 2634cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCObjectFileInfo.h" 2734cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/MC/MCSubtargetInfo.h" 2834cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/Object/ObjectFile.h" 2934cbf161d7b1191ad5c1b3bc02fc52d338e8b175Jiri Simsa#include "llvm/Target/TargetMachine.h" 301e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include "tensorflow/compiler/xla/statusor.h" 311e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#include "tensorflow/compiler/xla/types.h" 321e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 331e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace xla { 341e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsnamespace cpu { 351e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 3636725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlowerstruct DisassemblerResult { 3736725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower DisassemblerResult(const string& text, size_t code_size_bytes) 3836725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower : text(text), code_size_bytes(code_size_bytes) {} 3936725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower 406e7be32a555a32adaec7093be23606815156f334ManHyuk // The disassembled text sections of the object file. 4136725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower string text; 4236725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower // The total number of bytes of executable code in the object file. 4336725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower uint64_t code_size_bytes; 4436725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower}; 4536725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower 461e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// Class for disassembling object files (and potentially other constructs) into 4736725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower// x86/ARM assembly. Builds all the LLVM disassembly and instruction printing 481e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins// constructs from a given TargetMachine. 491e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkinsclass Disassembler { 501e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins public: 511e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins explicit Disassembler(const llvm::TargetMachine& target_machine); 521e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 5336725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower // Returns a DisassemblerResult for the given object file, containing the 5436725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower // disassembled code. 551e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // 566e7be32a555a32adaec7093be23606815156f334ManHyuk // If we couldn't retrieve a disassembler for this platform, an error status 571e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins // is returned. 5836725ea1dcc80e9953a88076b499b44296ff74d8A. Unique TensorFlower StatusOr<DisassemblerResult> DisassembleObjectFile( 591e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const llvm::object::ObjectFile& object_file) const; 601e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 611e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins private: 621e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins const llvm::MCSubtargetInfo& subtarget_info_; 631e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins std::unique_ptr<llvm::MCObjectFileInfo> objfile_info_; 641e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins std::unique_ptr<llvm::MCContext> mc_context_; 651e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins std::unique_ptr<llvm::MCDisassembler> disassembler_; 661e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins std::unique_ptr<llvm::MCInstPrinter> inst_printer_; 671e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins std::unique_ptr<llvm::MCInstrAnalysis> inst_analysis_; 681e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins}; 691e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 701e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace cpu 711e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins} // namespace xla 721e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins 731e67c90e2caceeff82d09793d1ef5fa0300d219bPeter Hawkins#endif // TENSORFLOW_COMPILER_XLA_SERVICE_CPU_DISASSEMBLER_H_ 74