A known limitation for Future CPU is that the new prefixed instructions may not cross 64 Byte boundaries. All instructions are already 4 byte aligned so the only situation where this can occur is when the prefix is in one 64 byte block and the instruction that is prefixed is at the top of the next 64 byte block. To fix this case PPCELFStreamer was added to intercept EmitInstruction. When a prefixed instruction is emitted we try to align it to 64 Bytes by adding a maximum of 4 bytes. If the prefixed instruction crosses the 64 Byte boundary then the alignment would trigger and a 4 byte nop would be added to push the instruction into the next 64 byte block. Differential Revision: https://reviews.llvm.org/D72570
53 lines
1.8 KiB
C++
53 lines
1.8 KiB
C++
//===- PPCELFStreamer.h - ELF Object Output --------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This is a custom MCELFStreamer for PowerPC.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H
|
|
#define LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/MC/MCELFStreamer.h"
|
|
#include <memory>
|
|
|
|
namespace llvm {
|
|
|
|
class MCAsmBackend;
|
|
class MCCodeEmitter;
|
|
class MCContext;
|
|
class MCSubtargetInfo;
|
|
|
|
class PPCELFStreamer : public MCELFStreamer {
|
|
// We need to keep track of the last label we emitted (only one) because
|
|
// depending on whether the label is on the same line as an aligned
|
|
// instruction or not, the label may refer to the instruction or the nop.
|
|
MCSymbol *LastLabel;
|
|
SMLoc LastLabelLoc;
|
|
|
|
public:
|
|
PPCELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> MAB,
|
|
std::unique_ptr<MCObjectWriter> OW,
|
|
std::unique_ptr<MCCodeEmitter> Emitter);
|
|
|
|
void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
|
|
|
|
// EmitLabel updates LastLabel and LastLabelLoc when a new label is emitted.
|
|
void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
|
|
};
|
|
|
|
MCELFStreamer *createPPCELFStreamer(MCContext &Context,
|
|
std::unique_ptr<MCAsmBackend> MAB,
|
|
std::unique_ptr<MCObjectWriter> OW,
|
|
std::unique_ptr<MCCodeEmitter> Emitter);
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_TARGET_PPC_MCELFSTREAMER_PPCELFSTREAMER_H
|