[llvm-commits] [llvm] r135678 - in /llvm/trunk: CMakeLists.txt autoconf/configure.ac configure lib/Target/Mips/CMakeLists.txt lib/Target/Mips/Mips.h lib/Target/Mips/MipsCodeEmitter.cpp lib/Target/Mips/MipsJITInfo.cpp lib/Target/Mips/MipsJITInfo.h
Jeffrey Yasskin
jyasskin at google.com
Thu Jul 21 10:45:44 PDT 2011
This appears to have broken the cmake build with the following error:
CMake Error at cmake/modules/LLVMProcessSources.cmake:86 (message):
Found unknown source file
/Users/jyasskin/src/llvm/git/src/lib/Target/Mips/MipsJITInfo.cpp
Please update
/Users/jyasskin/src/llvm/git/src/lib/Target/Mips/CMakeLists.txt
Call Stack (most recent call first):
cmake/modules/LLVMProcessSources.cmake:42 (llvm_check_source_file_list)
cmake/modules/AddLLVM.cmake:5 (llvm_process_sources)
cmake/modules/AddLLVM.cmake:133 (add_llvm_library)
lib/Target/Mips/CMakeLists.txt:10 (add_llvm_target)
The following patch fixes it for me:
--- a/lib/Target/Mips/CMakeLists.txt
+++ b/lib/Target/Mips/CMakeLists.txt
@@ -17,6 +17,7 @@ add_llvm_target(MipsCodeGen
MipsISelDAGToDAG.cpp
MipsISelLowering.cpp
MipsFrameLowering.cpp
+ MipsJITInfo.cpp
MipsMCInstLower.cpp
MipsMCSymbolRefExpr.cpp
MipsRegisterInfo.cpp
Is there a reason you omitted MipsJITInfo.cpp from CMakeLists.txt, or
should I commit this patch?
On Thu, Jul 21, 2011 at 9:28 AM, Bruno Cardoso Lopes
<bruno.cardoso at gmail.com> wrote:
> Author: bruno
> Date: Thu Jul 21 11:28:51 2011
> New Revision: 135678
>
> URL: http://llvm.org/viewvc/llvm-project?rev=135678&view=rev
> Log:
> Added the infrastructute necessary for MIPS JIT support. Patch by Vladimir
> Stefanovic. I removed the part that actually emits the instructions cause
> I want that to get in better shape first and in incremental steps. This
> also makes it easier to review the upcoming parts.
>
> Added:
> llvm/trunk/lib/Target/Mips/MipsCodeEmitter.cpp
> llvm/trunk/lib/Target/Mips/MipsJITInfo.cpp
> llvm/trunk/lib/Target/Mips/MipsJITInfo.h
> llvm/trunk/lib/Target/Mips/MipsRelocations.h
> Modified:
> llvm/trunk/CMakeLists.txt
> llvm/trunk/autoconf/configure.ac
> llvm/trunk/configure
> llvm/trunk/lib/Target/Mips/CMakeLists.txt
> llvm/trunk/lib/Target/Mips/Mips.h
> llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
> llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
> llvm/trunk/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp
>
> Modified: llvm/trunk/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/CMakeLists.txt?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/CMakeLists.txt (original)
> +++ llvm/trunk/CMakeLists.txt Thu Jul 21 11:28:51 2011
> @@ -82,7 +82,7 @@
> )
>
> # List of targets with JIT support:
> -set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM)
> +set(LLVM_TARGETS_WITH_JIT X86 PowerPC ARM Mips)
>
> if( MSVC )
> set(LLVM_TARGETS_TO_BUILD X86
>
> Modified: llvm/trunk/autoconf/configure.ac
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/autoconf/configure.ac?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/autoconf/configure.ac (original)
> +++ llvm/trunk/autoconf/configure.ac Thu Jul 21 11:28:51 2011
> @@ -484,7 +484,7 @@
> x86_64) AC_SUBST(TARGET_HAS_JIT,1) ;;
> Alpha) AC_SUBST(TARGET_HAS_JIT,0) ;;
> ARM) AC_SUBST(TARGET_HAS_JIT,1) ;;
> - Mips) AC_SUBST(TARGET_HAS_JIT,0) ;;
> + Mips) AC_SUBST(TARGET_HAS_JIT,1) ;;
> XCore) AC_SUBST(TARGET_HAS_JIT,0) ;;
> MSP430) AC_SUBST(TARGET_HAS_JIT,0) ;;
> SystemZ) AC_SUBST(TARGET_HAS_JIT,0) ;;
>
> Modified: llvm/trunk/configure
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/configure?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/configure (original)
> +++ llvm/trunk/configure Thu Jul 21 11:28:51 2011
> @@ -4865,7 +4865,7 @@
> ;;
> ARM) TARGET_HAS_JIT=1
> ;;
> - Mips) TARGET_HAS_JIT=0
> + Mips) TARGET_HAS_JIT=1
> ;;
> XCore) TARGET_HAS_JIT=0
> ;;
>
> Modified: llvm/trunk/lib/Target/Mips/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/CMakeLists.txt?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Target/Mips/CMakeLists.txt Thu Jul 21 11:28:51 2011
> @@ -9,6 +9,7 @@
>
> add_llvm_target(MipsCodeGen
> MipsAsmPrinter.cpp
> + MipsCodeEmitter.cpp
> MipsDelaySlotFiller.cpp
> MipsEmitGPRestore.cpp
> MipsExpandPseudo.cpp
>
> Modified: llvm/trunk/lib/Target/Mips/Mips.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/Mips.h?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/Mips.h (original)
> +++ llvm/trunk/lib/Target/Mips/Mips.h Thu Jul 21 11:28:51 2011
> @@ -29,6 +29,9 @@
> FunctionPass *createMipsExpandPseudoPass(MipsTargetMachine &TM);
> FunctionPass *createMipsEmitGPRestorePass(MipsTargetMachine &TM);
>
> + FunctionPass *createMipsJITCodeEmitterPass(MipsTargetMachine &TM,
> + JITCodeEmitter &JCE);
> +
> } // end namespace llvm;
>
> #endif
>
> Added: llvm/trunk/lib/Target/Mips/MipsCodeEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsCodeEmitter.cpp?rev=135678&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsCodeEmitter.cpp (added)
> +++ llvm/trunk/lib/Target/Mips/MipsCodeEmitter.cpp Thu Jul 21 11:28:51 2011
> @@ -0,0 +1,193 @@
> +//===-- Mips/MipsCodeEmitter.cpp - Convert Mips code to machine code -----===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===---------------------------------------------------------------------===//
> +//
> +// This file contains the pass that transforms the Mips machine instructions
> +// into relocatable machine code.
> +//
> +//===---------------------------------------------------------------------===//
> +
> +#define DEBUG_TYPE "jit"
> +#include "Mips.h"
> +#include "MipsInstrInfo.h"
> +#include "MipsRelocations.h"
> +#include "MipsSubtarget.h"
> +#include "MipsTargetMachine.h"
> +#include "llvm/Constants.h"
> +#include "llvm/DerivedTypes.h"
> +#include "llvm/Function.h"
> +#include "llvm/PassManager.h"
> +#include "llvm/CodeGen/JITCodeEmitter.h"
> +#include "llvm/CodeGen/MachineConstantPool.h"
> +#include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/CodeGen/MachineInstr.h"
> +#include "llvm/CodeGen/MachineJumpTableInfo.h"
> +#include "llvm/CodeGen/MachineModuleInfo.h"
> +#include "llvm/CodeGen/Passes.h"
> +#include "llvm/ADT/Statistic.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/raw_ostream.h"
> +#ifndef NDEBUG
> +#include <iomanip>
> +#endif
> +
> +#include "llvm/CodeGen/MachineOperand.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +class MipsCodeEmitter : public MachineFunctionPass {
> + MipsJITInfo *JTI;
> + const MipsInstrInfo *II;
> + const TargetData *TD;
> + const MipsSubtarget *Subtarget;
> + TargetMachine &TM;
> + JITCodeEmitter &MCE;
> + const std::vector<MachineConstantPoolEntry> *MCPEs;
> + const std::vector<MachineJumpTableEntry> *MJTEs;
> + bool IsPIC;
> +
> + void getAnalysisUsage(AnalysisUsage &AU) const {
> + AU.addRequired<MachineModuleInfo> ();
> + MachineFunctionPass::getAnalysisUsage(AU);
> + }
> +
> + static char ID;
> +
> + public:
> + MipsCodeEmitter(TargetMachine &tm, JITCodeEmitter &mce) :
> + MachineFunctionPass(ID), JTI(0),
> + II((const MipsInstrInfo *) tm.getInstrInfo()),
> + TD(tm.getTargetData()), TM(tm), MCE(mce), MCPEs(0), MJTEs(0),
> + IsPIC(TM.getRelocationModel() == Reloc::PIC_) {
> + }
> +
> + bool runOnMachineFunction(MachineFunction &MF);
> +
> + virtual const char *getPassName() const {
> + return "Mips Machine Code Emitter";
> + }
> +
> + void emitInstruction(const MachineInstr &MI);
> +
> + unsigned getOperandValue(const MachineOperand &MO,
> + unsigned relocType = -1);
> +
> + void emitGlobalAddress(const GlobalValue *GV, unsigned Reloc,
> + bool MayNeedFarStub = true);
> +
> + void emitMachineBasicBlock(MachineBasicBlock *BB, unsigned Reloc,
> + intptr_t JTBase = 0);
> +
> + void emitExternalSymbolAddress(const char *ES, unsigned Reloc);
> + void emitJumpTableAddress(unsigned JTIndex, unsigned Reloc) const;
> + void emitConstPoolAddress(unsigned CPI, unsigned Reloc);
> +};
> +}
> +
> +void MipsCodeEmitter::emitGlobalAddress(const GlobalValue *GV, unsigned Reloc,
> + bool mayNeedFarStub) {
> + MachineRelocation MR = MachineRelocation::getGV(MCE.getCurrentPCOffset(),
> + Reloc, const_cast<GlobalValue *> (GV), 0, mayNeedFarStub);
> + MCE.addRelocation(MR);
> +}
> +
> +/// emitMachineBasicBlock - Emit the specified address basic block.
> +void MipsCodeEmitter::emitMachineBasicBlock(MachineBasicBlock *BB,
> + unsigned Reloc, intptr_t JTBase) {
> + MCE.addRelocation(
> + MachineRelocation::getBB(MCE.getCurrentPCOffset(), Reloc, BB, JTBase));
> +}
> +
> +void MipsCodeEmitter::emitExternalSymbolAddress(const char *ES,
> + unsigned Reloc) {
> + MCE.addRelocation(
> + MachineRelocation::getExtSym(MCE.getCurrentPCOffset(), Reloc, ES, 0, 0,
> + false));
> +}
> +
> +void MipsCodeEmitter::emitJumpTableAddress(unsigned JTIndex, unsigned Reloc)
> + const {
> + MCE.addRelocation(
> + MachineRelocation::getJumpTable(MCE.getCurrentPCOffset(), Reloc, JTIndex,
> + 0, false));
> +}
> +
> +void MipsCodeEmitter::emitConstPoolAddress(unsigned CPI, unsigned Reloc) {
> + MCE.addRelocation(
> + MachineRelocation::getConstPool
> + (MCE.getCurrentPCOffset(), Reloc, CPI, 0));
> +}
> +
> +/// createMipsJITCodeEmitterPass - Return a pass that emits the collected Mips
> +/// code to the specified MCE object.
> +FunctionPass *llvm::createMipsJITCodeEmitterPass(MipsTargetMachine &TM,
> + JITCodeEmitter &JCE) {
> + return new MipsCodeEmitter(TM, JCE);
> +}
> +
> +char MipsCodeEmitter::ID = 10;
> +
> +bool MipsCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
> + JTI = ((MipsTargetMachine&) MF.getTarget()).getJITInfo();
> + II = ((const MipsTargetMachine&) MF.getTarget()).getInstrInfo();
> + TD = ((const MipsTargetMachine&) MF.getTarget()).getTargetData();
> + Subtarget = &TM.getSubtarget<MipsSubtarget> ();
> + MCPEs = &MF.getConstantPool()->getConstants();
> + MJTEs = 0;
> + if (MF.getJumpTableInfo()) MJTEs = &MF.getJumpTableInfo()->getJumpTables();
> + JTI->Initialize(MF, IsPIC);
> + MCE.setModuleInfo(&getAnalysis<MachineModuleInfo> ());
> +
> + do {
> + DEBUG(errs() << "JITTing function '"
> + << MF.getFunction()->getName() << "'\n");
> + MCE.startFunction(MF);
> +
> + for (MachineFunction::iterator MBB = MF.begin(), E = MF.end();
> + MBB != E; ++MBB){
> + MCE.StartMachineBasicBlock(MBB);
> + for (MachineBasicBlock::const_iterator I = MBB->begin(), E = MBB->end();
> + I != E; ++I)
> + emitInstruction(*I);
> + }
> + } while (MCE.finishFunction(MF));
> +
> + return false;
> +}
> +
> +void MipsCodeEmitter::emitInstruction(const MachineInstr &MI) {}
> +
> +unsigned MipsCodeEmitter::getOperandValue(const MachineOperand &MO,
> + unsigned relocType) {
> + switch (MO.getType()) {
> + case MachineOperand::MO_Immediate:
> + return MO.getImm();
> + case MachineOperand::MO_GlobalAddress:
> + emitGlobalAddress(MO.getGlobal(), relocType, false);
> + return 0;
> + case MachineOperand::MO_ExternalSymbol:
> + emitExternalSymbolAddress(MO.getSymbolName(), relocType);
> + return 0;
> + case MachineOperand::MO_MachineBasicBlock:
> + emitMachineBasicBlock(MO.getMBB(), relocType, MCE.getCurrentPCValue());
> + return 0;
> + case MachineOperand::MO_Register:
> + return MipsRegisterInfo::getRegisterNumbering(MO.getReg());
> + case MachineOperand::MO_JumpTableIndex:
> + emitJumpTableAddress(MO.getIndex(), relocType);
> + return 0;
> + case MachineOperand::MO_ConstantPoolIndex:
> + emitConstPoolAddress(MO.getIndex(), relocType);
> + return 0;
> + default: return 0;
> + }
> +}
> +
>
> Added: llvm/trunk/lib/Target/Mips/MipsJITInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsJITInfo.cpp?rev=135678&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsJITInfo.cpp (added)
> +++ llvm/trunk/lib/Target/Mips/MipsJITInfo.cpp Thu Jul 21 11:28:51 2011
> @@ -0,0 +1,195 @@
> +//===- MipsJITInfo.cpp - Implement the JIT interfaces for the Mips target -===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements the JIT interfaces for the Mips target.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#define DEBUG_TYPE "jit"
> +#include "MipsJITInfo.h"
> +#include "MipsInstrInfo.h"
> +#include "MipsRelocations.h"
> +#include "MipsSubtarget.h"
> +#include "llvm/Function.h"
> +#include "llvm/CodeGen/JITCodeEmitter.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Support/Memory.h"
> +#include <cstdlib>
> +using namespace llvm;
> +
> +
> +void MipsJITInfo::replaceMachineCodeForFunction(void *Old, void *New) {
> + report_fatal_error("MipsJITInfo::replaceMachineCodeForFunction");
> +}
> +
> +/// JITCompilerFunction - This contains the address of the JIT function used to
> +/// compile a function lazily.
> +static TargetJITInfo::JITCompilerFn JITCompilerFunction;
> +
> +// Get the ASMPREFIX for the current host. This is often '_'.
> +#ifndef __USER_LABEL_PREFIX__
> +#define __USER_LABEL_PREFIX__
> +#endif
> +#define GETASMPREFIX2(X) #X
> +#define GETASMPREFIX(X) GETASMPREFIX2(X)
> +#define ASMPREFIX GETASMPREFIX(__USER_LABEL_PREFIX__)
> +
> +// save registers, call MipsCompilationCallbackC, restore registers
> +extern "C" {
> +#if defined (__mips__)
> +void MipsCompilationCallback();
> +
> + asm(
> + ".text\n"
> + ".align 2\n"
> + ".globl " ASMPREFIX "MipsCompilationCallback\n"
> + ASMPREFIX "MipsCompilationCallback:\n"
> + ".ent " ASMPREFIX "MipsCompilationCallback\n"
> + ".set noreorder\n"
> + ".cpload $t9\n"
> + ".frame $29, 32, $31\n"
> +
> + "addiu $sp, $sp, -40\n"
> + "sw $a0, 4($sp)\n"
> + "sw $a1, 8($sp)\n"
> + "sw $a2, 12($sp)\n"
> + "sw $a3, 20($sp)\n"
> + "sw $ra, 24($sp)\n"
> + "sw $v0, 28($sp)\n"
> + "sw $v1, 32($sp)\n"
> + "sw $t8, 36($sp)\n"
> + ".cprestore 16\n"
> +
> + "addiu $a0, $t8, -16\n"
> + "jal " ASMPREFIX "MipsCompilationCallbackC\n"
> + "nop\n"
> +
> + "lw $a0, 4($sp)\n"
> + "lw $a1, 8($sp)\n"
> + "lw $a2, 12($sp)\n"
> + "lw $a3, 20($sp)\n"
> + "lw $ra, 24($sp)\n"
> + "lw $v0, 28($sp)\n"
> + "lw $v1, 32($sp)\n"
> + "lw $t8, 36($sp)\n"
> + "addiu $sp, $sp, 40\n"
> +
> + "addiu $t8, $t8, -16\n"
> + "jr $t8\n"
> + "nop\n"
> +
> + ".set reorder\n"
> + ".end " ASMPREFIX "MipsCompilationCallback\n"
> + );
> +#else // host != Mips
> + void MipsCompilationCallback() {
> + llvm_unreachable(
> + "Cannot call MipsCompilationCallback() on a non-Mips arch!");
> + }
> +#endif
> +}
> +
> +/// MipsCompilationCallbackC - This is the target-specific function invoked
> +/// by the function stub when we did not know the real target of a call.
> +/// This function must locate the start of the stub or call site and pass
> +/// it into the JIT compiler function.
> +extern "C" void MipsCompilationCallbackC(intptr_t StubAddr) {
> +
> + // Get the address of the compiled code for this function.
> + intptr_t NewVal = (intptr_t) JITCompilerFunction((void*) StubAddr);
> +
> + *(intptr_t *) (StubAddr) = 2 << 26 | ((NewVal & 0x0fffffff) >> 2); // J NewVal
> + *(intptr_t *) (StubAddr + 4) = 0; // NOP
> + *(intptr_t *) (StubAddr + 8) = 0; // NOP
> + *(intptr_t *) (StubAddr + 12) = 0; // NOP
> +
> + sys::Memory::InvalidateInstructionCache((void*) StubAddr, 16);
> +}
> +
> +TargetJITInfo::LazyResolverFn MipsJITInfo::getLazyResolverFunction(
> + JITCompilerFn F) {
> + JITCompilerFunction = F;
> + return MipsCompilationCallback;
> +}
> +
> +TargetJITInfo::StubLayout MipsJITInfo::getStubLayout() {
> + StubLayout Result = { 24, 4 }; // {Size. Alignment} (of FunctionStub)
> + return Result;
> +}
> +
> +void *MipsJITInfo::emitFunctionStub(const Function* F, void *Fn,
> + JITCodeEmitter &JCE) {
> + JCE.emitAlignment(4);
> + void *Addr = (void*) (JCE.getCurrentPCValue());
> +
> + unsigned arg0 = ((intptr_t) MipsCompilationCallback >> 16);
> + if ((((intptr_t) MipsCompilationCallback & 0xffff) >> 15) == 1) {
> + arg0 += 1; // same hack as in relocate()
> + }
> +
> + // LUI t9, %hi(MipsCompilationCallback)
> + JCE.emitWordLE(0xf << 26 | 25 << 16 | arg0);
> + // ADDiu t9, t9, %lo(MipsCompilationCallback)
> + JCE.emitWordLE(9 << 26 | 25 << 21 | 25 << 16
> + | ((intptr_t) MipsCompilationCallback & 0xffff));
> + // JALR t8, t9
> + JCE.emitWordLE(25 << 21 | 24 << 11 | 9);
> + JCE.emitWordLE(0); // NOP
> +
> + sys::Memory::InvalidateInstructionCache((void*) Addr, 16);
> +
> + return Addr;
> +}
> +
> +/// relocate - Before the JIT can run a block of code that has been emitted,
> +/// it must rewrite the code to contain the actual addresses of any
> +/// referenced global symbols.
> +void MipsJITInfo::relocate(void *Function, MachineRelocation *MR,
> + unsigned NumRelocs, unsigned char* GOTBase) {
> + for (unsigned i = 0; i != NumRelocs; ++i, ++MR) {
> +
> + void *RelocPos = (char*) Function + MR->getMachineCodeOffset();
> + intptr_t ResultPtr = (intptr_t) MR->getResultPointer();
> +
> + switch ((Mips::RelocationType) MR->getRelocationType()) {
> + case Mips::reloc_mips_pcrel:
> + ResultPtr = (((ResultPtr - (intptr_t) RelocPos) - 4) >> 2) & 0xffff;
> + *((unsigned*) RelocPos) |= (unsigned) ResultPtr;
> + break;
> +
> + case Mips::reloc_mips_j_jal: {
> + ResultPtr = (ResultPtr & 0x0fffffff) >> 2;
> + *((unsigned*) RelocPos) |= (unsigned) ResultPtr;
> + }
> + break;
> +
> + case Mips::reloc_mips_hi: {
> + ResultPtr = ResultPtr >> 16;
> +
> + // see See MIPS Run Linux, chapter 9.4
> + if ((((intptr_t) (MR->getResultPointer()) & 0xffff) >> 15) == 1) {
> + ResultPtr += 1;
> + }
> +
> + *((unsigned*) RelocPos) |= (unsigned) ResultPtr;
> + }
> + break;
> +
> + case Mips::reloc_mips_lo:
> + ResultPtr = ResultPtr & 0xffff;
> + *((unsigned*) RelocPos) |= (unsigned) ResultPtr;
> + break;
> +
> + default:
> + assert(0 && "MipsJITInfo.unknown relocation;");
> + }
> + }
> +}
>
> Added: llvm/trunk/lib/Target/Mips/MipsJITInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsJITInfo.h?rev=135678&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsJITInfo.h (added)
> +++ llvm/trunk/lib/Target/Mips/MipsJITInfo.h Thu Jul 21 11:28:51 2011
> @@ -0,0 +1,70 @@
> +//===- MipsJITInfo.h - Mips implementation of the JIT interface -*- C++ -*-===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file contains the declaration of the MipsJITInfo class.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef MIPSJITINFO_H
> +#define MIPSJITINFO_H
> +
> +#include "MipsMachineFunction.h"
> +#include "llvm/CodeGen/MachineConstantPool.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineJumpTableInfo.h"
> +#include "llvm/Target/TargetJITInfo.h"
> +#include "llvm/ADT/DenseMap.h"
> +#include "llvm/ADT/SmallVector.h"
> +
> +namespace llvm {
> +class MipsTargetMachine;
> +
> +class MipsJITInfo : public TargetJITInfo {
> +
> + bool IsPIC;
> +
> + public:
> + explicit MipsJITInfo() :
> + IsPIC(false) {}
> +
> + /// replaceMachineCodeForFunction - Make it so that calling the function
> + /// whose machine code is at OLD turns into a call to NEW, perhaps by
> + /// overwriting OLD with a branch to NEW. This is used for self-modifying
> + /// code.
> + ///
> + virtual void replaceMachineCodeForFunction(void *Old, void *New);
> +
> + // getStubLayout - Returns the size and alignment of the largest call stub
> + // on Mips.
> + virtual StubLayout getStubLayout();
> +
> + /// emitFunctionStub - Use the specified JITCodeEmitter object to emit a
> + /// small native function that simply calls the function at the specified
> + /// address.
> + virtual void *emitFunctionStub(const Function* F, void *Fn,
> + JITCodeEmitter &JCE);
> +
> + /// getLazyResolverFunction - Expose the lazy resolver to the JIT.
> + virtual LazyResolverFn getLazyResolverFunction(JITCompilerFn);
> +
> + /// relocate - Before the JIT can run a block of code that has been emitted,
> + /// it must rewrite the code to contain the actual addresses of any
> + /// referenced global symbols.
> + virtual void relocate(void *Function, MachineRelocation *MR,
> + unsigned NumRelocs, unsigned char* GOTBase);
> +
> + /// Initialize - Initialize internal stage for the function being JITted.
> + void Initialize(const MachineFunction &MF, bool isPIC) {
> + IsPIC = isPIC;
> + }
> +
> +};
> +}
> +
> +#endif
>
> Added: llvm/trunk/lib/Target/Mips/MipsRelocations.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsRelocations.h?rev=135678&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsRelocations.h (added)
> +++ llvm/trunk/lib/Target/Mips/MipsRelocations.h Thu Jul 21 11:28:51 2011
> @@ -0,0 +1,32 @@
> +//===- MipsRelocations.h - Mips Code Relocations ---------------*- C++ -*-===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===---------------------------------------------------------------------===//
> +//
> +// This file defines the Mips target-specific relocation types
> +// (for relocation-model=static).
> +//
> +//===---------------------------------------------------------------------===//
> +
> +#ifndef MIPSRELOCATIONS_H_
> +#define MIPSRELOCATIONS_H_
> +
> +#include "llvm/CodeGen/MachineRelocation.h"
> +
> +namespace llvm {
> + namespace Mips{
> + enum RelocationType {
> + reloc_mips_pcrel = 1,
> + reloc_mips_hi = 3,
> + reloc_mips_lo = 4,
> + reloc_mips_j_jal = 5
> + };
> + }
> +}
> +
> +#endif /* MIPSRELOCATIONS_H_ */
> +
>
> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.cpp Thu Jul 21 11:28:51 2011
> @@ -42,7 +42,7 @@
> std::string("E-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32")),
> InstrInfo(*this),
> FrameLowering(Subtarget),
> - TLInfo(*this), TSInfo(*this) {
> + TLInfo(*this), TSInfo(*this), JITInfo() {
> }
>
> MipselTargetMachine::
> @@ -81,3 +81,12 @@
> PM.add(createMipsExpandPseudoPass(*this));
> return true;
> }
> +
> +bool MipsTargetMachine::addCodeEmitter(PassManagerBase &PM,
> + CodeGenOpt::Level OptLevel,
> + JITCodeEmitter &JCE) {
> + // Machine code emitter pass for Mips.
> + PM.add(createMipsJITCodeEmitterPass(*this, JCE));
> + return false;
> +}
> +
>
> Modified: llvm/trunk/lib/Target/Mips/MipsTargetMachine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsTargetMachine.h?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/MipsTargetMachine.h (original)
> +++ llvm/trunk/lib/Target/Mips/MipsTargetMachine.h Thu Jul 21 11:28:51 2011
> @@ -22,6 +22,7 @@
> #include "llvm/Target/TargetMachine.h"
> #include "llvm/Target/TargetData.h"
> #include "llvm/Target/TargetFrameLowering.h"
> +#include "MipsJITInfo.h"
>
> namespace llvm {
> class formatted_raw_ostream;
> @@ -33,6 +34,9 @@
> MipsFrameLowering FrameLowering;
> MipsTargetLowering TLInfo;
> MipsSelectionDAGInfo TSInfo;
> + MipsJITInfo JITInfo;
> + Reloc::Model DefRelocModel; // Reloc model before it's overridden.
> +
> public:
> MipsTargetMachine(const Target &T, StringRef TT,
> StringRef CPU, StringRef FS,
> @@ -47,6 +51,9 @@
> { return &Subtarget; }
> virtual const TargetData *getTargetData() const
> { return &DataLayout;}
> + virtual MipsJITInfo *getJITInfo()
> + { return &JITInfo; }
> +
>
> virtual const MipsRegisterInfo *getRegisterInfo() const {
> return &InstrInfo.getRegisterInfo();
> @@ -68,6 +75,10 @@
> virtual bool addPreRegAlloc(PassManagerBase &PM,
> CodeGenOpt::Level OptLevel);
> virtual bool addPostRegAlloc(PassManagerBase &, CodeGenOpt::Level);
> + virtual bool addCodeEmitter(PassManagerBase &PM,
> + CodeGenOpt::Level OptLevel,
> + JITCodeEmitter &JCE);
> +
> };
>
> /// MipselTargetMachine - Mipsel target machine.
>
> Modified: llvm/trunk/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp?rev=135678&r1=135677&r2=135678&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp (original)
> +++ llvm/trunk/lib/Target/Mips/TargetInfo/MipsTargetInfo.cpp Thu Jul 21 11:28:51 2011
> @@ -15,7 +15,9 @@
> Target llvm::TheMipsTarget, llvm::TheMipselTarget;
>
> extern "C" void LLVMInitializeMipsTargetInfo() {
> - RegisterTarget<Triple::mips> X(TheMipsTarget, "mips", "Mips");
> + RegisterTarget<Triple::mips,
> + /*HasJIT=*/true> X(TheMipsTarget, "mips", "Mips");
>
> - RegisterTarget<Triple::mipsel> Y(TheMipselTarget, "mipsel", "Mipsel");
> + RegisterTarget<Triple::mipsel,
> + /*HasJIT=*/true> Y(TheMipselTarget, "mipsel", "Mipsel");
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list