mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
3f4c58083e
Infrastructure designed for padding code with nop instructions in key places such that preformance improvement will be achieved. The infrastructure is implemented such that the padding is done in the Assembler after the layout is done and all IPs and alignments are known. This patch by itself in a NFC. Future patches will make use of this infrastructure to implement required policies for code padding. Reviewers: aaboud zvi craig.topper gadi.haber Differential revision: https://reviews.llvm.org/D34393 Change-Id: I92110d0c0a757080a8405636914a93ef6f8ad00e llvm-svn: 316413
87 lines
2.8 KiB
C++
87 lines
2.8 KiB
C++
//===- MCAsmBackend.cpp - Target MC Assembly Backend ----------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCAsmBackend.h"
|
|
#include "llvm/ADT/None.h"
|
|
#include "llvm/ADT/STLExtras.h"
|
|
#include "llvm/MC/MCCodePadder.h"
|
|
#include "llvm/MC/MCFixupKindInfo.h"
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
using namespace llvm;
|
|
|
|
MCAsmBackend::MCAsmBackend() : CodePadder(new MCCodePadder()) {}
|
|
|
|
MCAsmBackend::MCAsmBackend(std::unique_ptr<MCCodePadder> TargetCodePadder)
|
|
: CodePadder(std::move(TargetCodePadder)) {}
|
|
|
|
MCAsmBackend::~MCAsmBackend() = default;
|
|
|
|
Optional<MCFixupKind> MCAsmBackend::getFixupKind(StringRef Name) const {
|
|
return None;
|
|
}
|
|
|
|
const MCFixupKindInfo &MCAsmBackend::getFixupKindInfo(MCFixupKind Kind) const {
|
|
static const MCFixupKindInfo Builtins[] = {
|
|
{"FK_Data_1", 0, 8, 0},
|
|
{"FK_Data_2", 0, 16, 0},
|
|
{"FK_Data_4", 0, 32, 0},
|
|
{"FK_Data_8", 0, 64, 0},
|
|
{"FK_PCRel_1", 0, 8, MCFixupKindInfo::FKF_IsPCRel},
|
|
{"FK_PCRel_2", 0, 16, MCFixupKindInfo::FKF_IsPCRel},
|
|
{"FK_PCRel_4", 0, 32, MCFixupKindInfo::FKF_IsPCRel},
|
|
{"FK_PCRel_8", 0, 64, MCFixupKindInfo::FKF_IsPCRel},
|
|
{"FK_GPRel_1", 0, 8, 0},
|
|
{"FK_GPRel_2", 0, 16, 0},
|
|
{"FK_GPRel_4", 0, 32, 0},
|
|
{"FK_GPRel_8", 0, 64, 0},
|
|
{"FK_DTPRel_4", 0, 32, 0},
|
|
{"FK_DTPRel_8", 0, 64, 0},
|
|
{"FK_TPRel_4", 0, 32, 0},
|
|
{"FK_TPRel_8", 0, 64, 0},
|
|
{"FK_SecRel_1", 0, 8, 0},
|
|
{"FK_SecRel_2", 0, 16, 0},
|
|
{"FK_SecRel_4", 0, 32, 0},
|
|
{"FK_SecRel_8", 0, 64, 0}};
|
|
|
|
assert((size_t)Kind <= array_lengthof(Builtins) && "Unknown fixup kind");
|
|
return Builtins[Kind];
|
|
}
|
|
|
|
bool MCAsmBackend::fixupNeedsRelaxationAdvanced(
|
|
const MCFixup &Fixup, bool Resolved, uint64_t Value,
|
|
const MCRelaxableFragment *DF, const MCAsmLayout &Layout) const {
|
|
if (!Resolved)
|
|
return true;
|
|
return fixupNeedsRelaxation(Fixup, Value, DF, Layout);
|
|
}
|
|
|
|
void MCAsmBackend::handleCodePaddingBasicBlockStart(
|
|
MCObjectStreamer *OS, const MCCodePaddingContext &Context) {
|
|
CodePadder->handleBasicBlockStart(OS, Context);
|
|
}
|
|
|
|
void MCAsmBackend::handleCodePaddingBasicBlockEnd(
|
|
const MCCodePaddingContext &Context) {
|
|
CodePadder->handleBasicBlockEnd(Context);
|
|
}
|
|
|
|
void MCAsmBackend::handleCodePaddingInstructionBegin(const MCInst &Inst) {
|
|
CodePadder->handleInstructionBegin(Inst);
|
|
}
|
|
|
|
void MCAsmBackend::handleCodePaddingInstructionEnd(const MCInst &Inst) {
|
|
CodePadder->handleInstructionEnd(Inst);
|
|
}
|
|
|
|
bool MCAsmBackend::relaxFragment(MCPaddingFragment *PF, MCAsmLayout &Layout) {
|
|
return CodePadder->relaxFragment(PF, Layout);
|
|
} |