Split the file MipsAsmBackend.cpp in Split the file MipsAsmBackend.cpp and Split the file MipsAsmBackend.h.

Differential Revision: http://llvm-reviews.chandlerc.com/D3134

llvm-svn: 204921
This commit is contained in:
Zoran Jovanovic 2014-03-27 12:38:40 +00:00
parent 82540e9ef8
commit ada38ef61b
2 changed files with 237 additions and 191 deletions

View File

@ -1,4 +1,4 @@
//===-- MipsASMBackend.cpp - Mips Asm Backend ----------------------------===// //===-- MipsAsmBackend.cpp - Mips Asm Backend ----------------------------===//
// //
// The LLVM Compiler Infrastructure // The LLVM Compiler Infrastructure
// //
@ -7,12 +7,13 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
// This file implements the MipsAsmBackend and MipsELFObjectWriter classes. // This file implements the MipsAsmBackend class.
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// //
#include "MipsFixupKinds.h" #include "MCTargetDesc/MipsFixupKinds.h"
#include "MCTargetDesc/MipsAsmBackend.h"
#include "MCTargetDesc/MipsMCTargetDesc.h" #include "MCTargetDesc/MipsMCTargetDesc.h"
#include "llvm/MC/MCAsmBackend.h" #include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCAssembler.h"
@ -106,18 +107,7 @@ static unsigned adjustFixupValue(const MCFixup &Fixup, uint64_t Value,
return Value; return Value;
} }
namespace { MCObjectWriter *MipsAsmBackend::createObjectWriter(raw_ostream &OS) const {
class MipsAsmBackend : public MCAsmBackend {
Triple::OSType OSType;
bool IsLittle; // Big or little endian
bool Is64Bit; // 32 or 64 bit words
public:
MipsAsmBackend(const Target &T, Triple::OSType _OSType,
bool _isLittle, bool _is64Bit)
:MCAsmBackend(), OSType(_OSType), IsLittle(_isLittle), Is64Bit(_is64Bit) {}
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
return createMipsELFObjectWriter(OS, return createMipsELFObjectWriter(OS,
MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit); MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit);
} }
@ -125,8 +115,8 @@ public:
/// ApplyFixup - Apply the \p Value for given \p Fixup into the provided /// ApplyFixup - Apply the \p Value for given \p Fixup into the provided
/// data fragment, at the offset specified by the fixup and following the /// data fragment, at the offset specified by the fixup and following the
/// fixup kind as appropriate. /// fixup kind as appropriate.
void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, void MipsAsmBackend::applyFixup(const MCFixup &Fixup, char *Data,
uint64_t Value) const { unsigned DataSize, uint64_t Value) const {
MCFixupKind Kind = Fixup.getKind(); MCFixupKind Kind = Fixup.getKind();
Value = adjustFixupValue(Fixup, Value); Value = adjustFixupValue(Fixup, Value);
@ -174,9 +164,8 @@ public:
} }
} }
unsigned getNumFixupKinds() const { return Mips::NumTargetFixupKinds; } const MCFixupKindInfo &MipsAsmBackend::
getFixupKindInfo(MCFixupKind Kind) const {
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
const static MCFixupKindInfo Infos[Mips::NumTargetFixupKinds] = { const static MCFixupKindInfo Infos[Mips::NumTargetFixupKinds] = {
// This table *must* be in same the order of fixup_* kinds in // This table *must* be in same the order of fixup_* kinds in
// MipsFixupKinds.h. // MipsFixupKinds.h.
@ -242,45 +231,12 @@ public:
return Infos[Kind - FirstTargetFixupKind]; return Infos[Kind - FirstTargetFixupKind];
} }
/// @name Target Relaxation Interfaces
/// @{
/// MayNeedRelaxation - Check whether the given instruction may need
/// relaxation.
///
/// \param Inst - The instruction to test.
bool mayNeedRelaxation(const MCInst &Inst) const {
return false;
}
/// fixupNeedsRelaxation - Target specific predicate for whether a given
/// fixup requires the associated instruction to be relaxed.
bool fixupNeedsRelaxation(const MCFixup &Fixup,
uint64_t Value,
const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME.
assert(0 && "RelaxInstruction() unimplemented");
return false;
}
/// RelaxInstruction - Relax the instruction in the given fragment
/// to the next wider instruction.
///
/// \param Inst - The instruction to relax, which may be the same
/// as the output.
/// \param [out] Res On return, the relaxed instruction.
void relaxInstruction(const MCInst &Inst, MCInst &Res) const {
}
/// @}
/// WriteNopData - Write an (optimal) nop sequence of Count bytes /// WriteNopData - Write an (optimal) nop sequence of Count bytes
/// to the given output. If the target cannot generate such a sequence, /// to the given output. If the target cannot generate such a sequence,
/// it should return an error. /// it should return an error.
/// ///
/// \return - True on success. /// \return - True on success.
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const { bool MipsAsmBackend::writeNopData(uint64_t Count, MCObjectWriter *OW) const {
// Check for a less than instruction size number of bytes // Check for a less than instruction size number of bytes
// FIXME: 16 bit instructions are not handled yet here. // FIXME: 16 bit instructions are not handled yet here.
// We shouldn't be using a hard coded number for instruction size. // We shouldn't be using a hard coded number for instruction size.
@ -294,9 +250,12 @@ public:
/// processFixupValue - Target hook to process the literal value of a fixup /// processFixupValue - Target hook to process the literal value of a fixup
/// if necessary. /// if necessary.
void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout, void MipsAsmBackend::processFixupValue(const MCAssembler &Asm,
const MCFixup &Fixup, const MCFragment *DF, const MCAsmLayout &Layout,
MCValue &Target, uint64_t &Value, const MCFixup &Fixup,
const MCFragment *DF,
MCValue &Target,
uint64_t &Value,
bool &IsResolved) { bool &IsResolved) {
// At this point we'll ignore the value returned by adjustFixupValue as // At this point we'll ignore the value returned by adjustFixupValue as
// we are only checking if the fixup can be applied correctly. We have // we are only checking if the fixup can be applied correctly. We have
@ -305,10 +264,6 @@ public:
(void)adjustFixupValue(Fixup, Value, &Asm.getContext()); (void)adjustFixupValue(Fixup, Value, &Asm.getContext());
} }
}; // class MipsAsmBackend
} // namespace
// MCAsmBackend // MCAsmBackend
MCAsmBackend *llvm::createMipsAsmBackendEL32(const Target &T, MCAsmBackend *llvm::createMipsAsmBackendEL32(const Target &T,
const MCRegisterInfo &MRI, const MCRegisterInfo &MRI,
@ -341,4 +296,3 @@ MCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T,
return new MipsAsmBackend(T, Triple(TT).getOS(), return new MipsAsmBackend(T, Triple(TT).getOS(),
/*IsLittle*/false, /*Is64Bit*/true); /*IsLittle*/false, /*Is64Bit*/true);
} }

View File

@ -0,0 +1,92 @@
//===-- MipsAsmBackend.h - Mips Asm Backend ------------------------------===//
//
// 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 MipsAsmBackend class.
//
//===----------------------------------------------------------------------===//
//
#ifndef MIPSASMBACKEND_H
#define MIPSASMBACKEND_H
#include "MCTargetDesc/MipsFixupKinds.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/ADT/Triple.h"
namespace llvm {
class MCAssembler;
class MCFixupKindInfo;
class Target;
class MCObjectWriter;
class MipsAsmBackend : public MCAsmBackend {
Triple::OSType OSType;
bool IsLittle; // Big or little endian
bool Is64Bit; // 32 or 64 bit words
public:
MipsAsmBackend(const Target &T, Triple::OSType _OSType, bool _isLittle,
bool _is64Bit)
: MCAsmBackend(), OSType(_OSType), IsLittle(_isLittle),
Is64Bit(_is64Bit) {}
MCObjectWriter *createObjectWriter(raw_ostream &OS) const;
void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
uint64_t Value) const;
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const;
unsigned getNumFixupKinds() const {
return Mips::NumTargetFixupKinds;
}
/// @name Target Relaxation Interfaces
/// @{
/// MayNeedRelaxation - Check whether the given instruction may need
/// relaxation.
///
/// \param Inst - The instruction to test.
bool mayNeedRelaxation(const MCInst &Inst) const {
return false;
}
/// fixupNeedsRelaxation - Target specific predicate for whether a given
/// fixup requires the associated instruction to be relaxed.
bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
const MCRelaxableFragment *DF,
const MCAsmLayout &Layout) const {
// FIXME.
assert(0 && "RelaxInstruction() unimplemented");
return false;
}
/// RelaxInstruction - Relax the instruction in the given fragment
/// to the next wider instruction.
///
/// \param Inst - The instruction to relax, which may be the same
/// as the output.
/// \param [out] Res On return, the relaxed instruction.
void relaxInstruction(const MCInst &Inst, MCInst &Res) const {}
/// @}
bool writeNopData(uint64_t Count, MCObjectWriter *OW) const;
void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout,
const MCFixup &Fixup, const MCFragment *DF,
MCValue &Target, uint64_t &Value, bool &IsResolved);
}; // class MipsAsmBackend
} // namespace
#endif