SystemZ adds the EXRL target instructions in the end of each file. This must be done before debug info emission since that may end the text section, and therefore this is now done in emitConstantPools() (instead of in emitEndOfAsmFile). Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D109513
56 lines
2.2 KiB
C++
56 lines
2.2 KiB
C++
//=- SystemZTargetStreamer.h - SystemZ Target Streamer ----------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H
|
|
#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/MC/MCStreamer.h"
|
|
|
|
namespace llvm {
|
|
|
|
class SystemZTargetStreamer : public MCTargetStreamer {
|
|
public:
|
|
SystemZTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
|
|
|
|
typedef std::pair<MCInst, const MCSubtargetInfo *> MCInstSTIPair;
|
|
struct CmpMCInst {
|
|
bool operator()(const MCInstSTIPair &MCI_STI_A,
|
|
const MCInstSTIPair &MCI_STI_B) const {
|
|
if (MCI_STI_A.second != MCI_STI_B.second)
|
|
return uintptr_t(MCI_STI_A.second) < uintptr_t(MCI_STI_B.second);
|
|
const MCInst &A = MCI_STI_A.first;
|
|
const MCInst &B = MCI_STI_B.first;
|
|
assert(A.getNumOperands() == B.getNumOperands() &&
|
|
A.getNumOperands() == 5 && A.getOperand(2).getImm() == 1 &&
|
|
B.getOperand(2).getImm() == 1 && "Unexpected EXRL target MCInst");
|
|
if (A.getOpcode() != B.getOpcode())
|
|
return A.getOpcode() < B.getOpcode();
|
|
if (A.getOperand(0).getReg() != B.getOperand(0).getReg())
|
|
return A.getOperand(0).getReg() < B.getOperand(0).getReg();
|
|
if (A.getOperand(1).getImm() != B.getOperand(1).getImm())
|
|
return A.getOperand(1).getImm() < B.getOperand(1).getImm();
|
|
if (A.getOperand(3).getReg() != B.getOperand(3).getReg())
|
|
return A.getOperand(3).getReg() < B.getOperand(3).getReg();
|
|
if (A.getOperand(4).getImm() != B.getOperand(4).getImm())
|
|
return A.getOperand(4).getImm() < B.getOperand(4).getImm();
|
|
return false;
|
|
}
|
|
};
|
|
typedef std::map<MCInstSTIPair, MCSymbol *, CmpMCInst> EXRLT2SymMap;
|
|
EXRLT2SymMap EXRLTargets2Sym;
|
|
|
|
void emitConstantPools() override;
|
|
|
|
virtual void emitMachine(StringRef CPU) = 0;
|
|
};
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZTARGETSTREAMER_H
|