1 //===-- LlvmState.cpp -------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "LlvmState.h" 11 #include "Target.h" 12 #include "llvm/ADT/SmallVector.h" 13 #include "llvm/MC/MCCodeEmitter.h" 14 #include "llvm/MC/MCContext.h" 15 #include "llvm/MC/MCFixup.h" 16 #include "llvm/MC/MCObjectFileInfo.h" 17 #include "llvm/Support/TargetRegistry.h" 18 #include "llvm/Support/raw_ostream.h" 19 #include "llvm/Target/TargetMachine.h" 20 #include "llvm/Target/TargetOptions.h" 21 22 namespace llvm { 23 namespace exegesis { 24 25 LLVMState::LLVMState(const std::string &Triple, const std::string &CpuName, 26 const std::string &Features) { 27 std::string Error; 28 const llvm::Target *const TheTarget = 29 llvm::TargetRegistry::lookupTarget(Triple, Error); 30 assert(TheTarget && "unknown target for host"); 31 const llvm::TargetOptions Options; 32 TargetMachine.reset( 33 static_cast<llvm::LLVMTargetMachine *>(TheTarget->createTargetMachine( 34 Triple, CpuName, Features, Options, llvm::Reloc::Model::Static))); 35 TheExegesisTarget = ExegesisTarget::lookup(TargetMachine->getTargetTriple()); 36 if (!TheExegesisTarget) { 37 llvm::errs() << "no exegesis target for " << Triple << ", using default\n"; 38 TheExegesisTarget = &ExegesisTarget::getDefault(); 39 } 40 PfmCounters = &TheExegesisTarget->getPfmCounters(CpuName); 41 42 RATC.reset(new RegisterAliasingTrackerCache( 43 getRegInfo(), getFunctionReservedRegs(getTargetMachine()))); 44 IC.reset(new InstructionsCache(getInstrInfo(), getRATC())); 45 } 46 47 LLVMState::LLVMState(const std::string &CpuName) 48 : LLVMState(llvm::sys::getProcessTriple(), 49 CpuName.empty() ? llvm::sys::getHostCPUName().str() : CpuName, 50 "") {} 51 52 std::unique_ptr<llvm::LLVMTargetMachine> 53 LLVMState::createTargetMachine() const { 54 return std::unique_ptr<llvm::LLVMTargetMachine>( 55 static_cast<llvm::LLVMTargetMachine *>( 56 TargetMachine->getTarget().createTargetMachine( 57 TargetMachine->getTargetTriple().normalize(), 58 TargetMachine->getTargetCPU(), 59 TargetMachine->getTargetFeatureString(), TargetMachine->Options, 60 llvm::Reloc::Model::Static))); 61 } 62 63 bool LLVMState::canAssemble(const llvm::MCInst &Inst) const { 64 llvm::MCObjectFileInfo ObjectFileInfo; 65 llvm::MCContext Context(TargetMachine->getMCAsmInfo(), 66 TargetMachine->getMCRegisterInfo(), &ObjectFileInfo); 67 std::unique_ptr<const llvm::MCCodeEmitter> CodeEmitter( 68 TargetMachine->getTarget().createMCCodeEmitter( 69 *TargetMachine->getMCInstrInfo(), *TargetMachine->getMCRegisterInfo(), 70 Context)); 71 llvm::SmallVector<char, 16> Tmp; 72 llvm::raw_svector_ostream OS(Tmp); 73 llvm::SmallVector<llvm::MCFixup, 4> Fixups; 74 CodeEmitter->encodeInstruction(Inst, OS, Fixups, 75 *TargetMachine->getMCSubtargetInfo()); 76 return Tmp.size() > 0; 77 } 78 79 } // namespace exegesis 80 } // namespace llvm 81