brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 761472b Raw
106 lines · c
1//===-- LlvmState.h ---------------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// A class to set up and access common LLVM objects.11///12//===----------------------------------------------------------------------===//13 14#ifndef LLVM_TOOLS_LLVM_EXEGESIS_LLVMSTATE_H15#define LLVM_TOOLS_LLVM_EXEGESIS_LLVMSTATE_H16 17#include "MCInstrDescView.h"18#include "RegisterAliasing.h"19#include "llvm/MC/MCAsmInfo.h"20#include "llvm/MC/MCInst.h"21#include "llvm/MC/MCInstrInfo.h"22#include "llvm/MC/MCRegister.h"23#include "llvm/MC/MCRegisterInfo.h"24#include "llvm/MC/MCSubtargetInfo.h"25#include "llvm/Target/TargetMachine.h"26#include <memory>27#include <string>28 29static constexpr llvm::StringLiteral kNoRegister("%noreg");30 31namespace llvm {32namespace exegesis {33 34class ExegesisTarget;35struct PfmCountersInfo;36 37// An object to initialize LLVM and prepare objects needed to run the38// measurements.39class LLVMState {40public:41  // Factory function.42  // If `Triple` is empty, uses the host triple.43  // If `CpuName` is empty, uses the host CPU.44  // If `UseDummyPerfCounters` is set, does not query the kernel45  // for event counts.46  // `UseDummyPerfCounters` and `Features` are intended for tests.47  static Expected<LLVMState> Create(std::string TripleName, std::string CpuName,48                                    StringRef Features = "",49                                    bool UseDummyPerfCounters = false);50 51  const TargetMachine &getTargetMachine() const { return *TheTargetMachine; }52  std::unique_ptr<TargetMachine> createTargetMachine() const;53 54  const ExegesisTarget &getExegesisTarget() const { return *TheExegesisTarget; }55 56  bool canAssemble(const MCInst &mc_inst) const;57 58  // For convenience:59  const MCInstrInfo &getInstrInfo() const {60    return *TheTargetMachine->getMCInstrInfo();61  }62  const MCRegisterInfo &getRegInfo() const {63    return *TheTargetMachine->getMCRegisterInfo();64  }65  const MCSubtargetInfo &getSubtargetInfo() const {66    return *TheTargetMachine->getMCSubtargetInfo();67  }68 69  const RegisterAliasingTrackerCache &getRATC() const { return *RATC; }70  const InstructionsCache &getIC() const { return *IC; }71 72  const PfmCountersInfo &getPfmCounters() const { return *PfmCounters; }73 74  const DenseMap<StringRef, unsigned> &getOpcodeNameToOpcodeIdxMapping() const {75    assert(OpcodeNameToOpcodeIdxMapping);76    return *OpcodeNameToOpcodeIdxMapping;77  };78 79  std::optional<MCRegister>80  getRegisterNumberFromName(StringRef RegisterName) const;81 82private:83  std::unique_ptr<const DenseMap<StringRef, unsigned>>84  createOpcodeNameToOpcodeIdxMapping() const;85 86  std::unique_ptr<const DenseMap<StringRef, MCRegister>>87  createRegNameToRegNoMapping() const;88 89  LLVMState(std::unique_ptr<const TargetMachine> TM, const ExegesisTarget *ET,90            const PfmCountersInfo *PCI);91 92  const ExegesisTarget *TheExegesisTarget;93  std::unique_ptr<const TargetMachine> TheTargetMachine;94  std::unique_ptr<const RegisterAliasingTrackerCache> RATC;95  std::unique_ptr<const InstructionsCache> IC;96  const PfmCountersInfo *PfmCounters;97  std::unique_ptr<const DenseMap<StringRef, unsigned>>98      OpcodeNameToOpcodeIdxMapping;99  std::unique_ptr<const DenseMap<StringRef, MCRegister>> RegNameToRegNoMapping;100};101 102} // namespace exegesis103} // namespace llvm104 105#endif // LLVM_TOOLS_LLVM_EXEGESIS_LLVMSTATE_H106