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