//===-- MCInstrDescView.h ---------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// Provide views around LLVM structures to represents an instruction instance, /// as well as its implicit and explicit arguments in a uniform way. /// Arguments that are explicit and independant (non tied) also have a Variable /// associated to them so the instruction can be fully defined by reading its /// Variables. /// //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVM_EXEGESIS_MCINSTRDESCVIEW_H #define LLVM_TOOLS_LLVM_EXEGESIS_MCINSTRDESCVIEW_H #include <memory> #include <random> #include <unordered_map> #include "RegisterAliasing.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstrDesc.h" #include "llvm/MC/MCInstrInfo.h" namespace llvm { namespace exegesis { // A variable represents the value associated to an Operand or a set of Operands // if they are tied together. struct Variable { … }; // MCOperandInfo can only represents Explicit operands. This object gives a // uniform view of Implicit and Explicit Operands. // - Index: can be used to refer to MCInstrDesc::operands for Explicit operands. // - Tracker: is set for Register Operands and is used to keep track of possible // registers and the registers reachable from them (aliasing registers). // - Info: a shortcut for MCInstrDesc::operands()[Index]. // - TiedToIndex: the index of the Operand holding the value or -1. // - ImplicitReg: the register value when Operand is Implicit, 0 otherwise. // - VariableIndex: the index of the Variable holding the value for this Operand // or -1 if this operand is implicit. struct Operand { … }; /// A cache of BitVector to reuse between Instructions. /// The cache will only be exercised during Instruction initialization. /// For X86, this is ~160 unique vectors for all of the ~15K Instructions. struct BitVectorCache { … }; // A view over an MCInstrDesc offering a convenient interface to compute // Register aliasing. struct Instruction { … }; // Instructions are expensive to instantiate. This class provides a cache of // Instructions with lazy construction. struct InstructionsCache { … }; // Represents the assignment of a Register to an Operand. struct RegisterOperandAssignment { … }; // Represents a set of Operands that would alias through the use of some // Registers. // There are two reasons why operands would alias: // - The registers assigned to each of the operands are the same or alias each // other (e.g. AX/AL) // - The operands are tied. struct AliasingRegisterOperands { … }; // Returns all possible configurations leading Def registers of DefInstruction // to alias with Use registers of UseInstruction. struct AliasingConfigurations { … }; // Writes MCInst to OS. // This is not assembly but the internal LLVM's name for instructions and // registers. void DumpMCInst(const MCRegisterInfo &MCRegisterInfo, const MCInstrInfo &MCInstrInfo, const MCInst &MCInst, raw_ostream &OS); } // namespace exegesis } // namespace llvm #endif // LLVM_TOOLS_LLVM_EXEGESIS_MCINSTRDESCVIEW_H