On targets like Arm some relaxations may only be performed when certain architectural features are available. As functions can be compiled with differing levels of architectural support we must make a judgement on whether we can relax based on the MCSubtargetInfo for the function. This change passes through the MCSubtargetInfo for the function to fixupNeedsRelaxation so that the decision on whether to relax can be made per function. In this patch, only the ARM backend makes use of this information. We must also pass the MCSubtargetInfo to applyFixup because some fixups skip error checking on the assumption that relaxation has occurred, to prevent code-generation errors applyFixup must see the same MCSubtargetInfo as fixupNeedsRelaxation. Differential Revision: https://reviews.llvm.org/D44928 llvm-svn: 334078
98 lines
3.1 KiB
C++
98 lines
3.1 KiB
C++
//===-- 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 LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSASMBACKEND_H
|
|
#define LLVM_LIB_TARGET_MIPS_MCTARGETDESC_MIPSASMBACKEND_H
|
|
|
|
#include "MCTargetDesc/MipsFixupKinds.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/MC/MCAsmBackend.h"
|
|
|
|
namespace llvm {
|
|
|
|
class MCAssembler;
|
|
struct MCFixupKindInfo;
|
|
class MCObjectWriter;
|
|
class MCRegisterInfo;
|
|
class Target;
|
|
|
|
class MipsAsmBackend : public MCAsmBackend {
|
|
Triple TheTriple;
|
|
bool IsN32;
|
|
|
|
public:
|
|
MipsAsmBackend(const Target &T, const MCRegisterInfo &MRI, const Triple &TT,
|
|
StringRef CPU, bool N32)
|
|
: MCAsmBackend(TT.isLittleEndian() ? support::little : support::big),
|
|
TheTriple(TT), IsN32(N32) {}
|
|
|
|
std::unique_ptr<MCObjectTargetWriter>
|
|
createObjectTargetWriter() const override;
|
|
|
|
void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
|
|
const MCValue &Target, MutableArrayRef<char> Data,
|
|
uint64_t Value, bool IsResolved,
|
|
const MCSubtargetInfo *STI) const override;
|
|
|
|
Optional<MCFixupKind> getFixupKind(StringRef Name) const override;
|
|
const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override;
|
|
|
|
unsigned getNumFixupKinds() const override {
|
|
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 MCSubtargetInfo &STI) const override {
|
|
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 override {
|
|
// FIXME.
|
|
llvm_unreachable("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, const MCSubtargetInfo &STI,
|
|
MCInst &Res) const override {}
|
|
|
|
/// @}
|
|
|
|
bool writeNopData(raw_ostream &OS, uint64_t Count) const override;
|
|
|
|
bool shouldForceRelocation(const MCAssembler &Asm, const MCFixup &Fixup,
|
|
const MCValue &Target) override;
|
|
|
|
}; // class MipsAsmBackend
|
|
|
|
} // namespace
|
|
|
|
#endif
|