mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-28 19:25:00 +00:00
Aligned bundling support. Following the discussion here:
http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-December/056754.html The proposal and implementation are fully documented here: https://sites.google.com/a/chromium.org/dev/nativeclient/pnacl/aligned-bundling-support-in-llvm Tests will follow shortly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170718 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -180,21 +180,27 @@ void MCObjectStreamer::EmitInstruction(const MCInst &Inst) {
|
||||
if (Inst.getOperand(i).isExpr())
|
||||
AddValueSymbols(Inst.getOperand(i).getExpr());
|
||||
|
||||
getCurrentSectionData()->setHasInstructions(true);
|
||||
MCSectionData *SD = getCurrentSectionData();
|
||||
SD->setHasInstructions(true);
|
||||
|
||||
// Now that a machine instruction has been assembled into this section, make
|
||||
// a line entry for any .loc directive that has been seen.
|
||||
MCLineEntry::Make(this, getCurrentSection());
|
||||
|
||||
// If this instruction doesn't need relaxation, just emit it as data.
|
||||
if (!getAssembler().getBackend().mayNeedRelaxation(Inst)) {
|
||||
MCAssembler &Assembler = getAssembler();
|
||||
if (!Assembler.getBackend().mayNeedRelaxation(Inst)) {
|
||||
EmitInstToData(Inst);
|
||||
return;
|
||||
}
|
||||
|
||||
// Otherwise, if we are relaxing everything, relax the instruction as much as
|
||||
// possible and emit it as data.
|
||||
if (getAssembler().getRelaxAll()) {
|
||||
// Otherwise, relax and emit it as data if either:
|
||||
// - The RelaxAll flag was passed
|
||||
// - Bundling is enabled and this instruction is inside a bundle-locked
|
||||
// group. We want to emit all such instructions into the same data
|
||||
// fragment.
|
||||
if (Assembler.getRelaxAll() ||
|
||||
(Assembler.isBundlingEnabled() && SD->isBundleLocked())) {
|
||||
MCInst Relaxed;
|
||||
getAssembler().getBackend().relaxInstruction(Inst, Relaxed);
|
||||
while (getAssembler().getBackend().mayNeedRelaxation(Relaxed))
|
||||
@@ -208,6 +214,8 @@ void MCObjectStreamer::EmitInstruction(const MCInst &Inst) {
|
||||
}
|
||||
|
||||
void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) {
|
||||
// Always create a new, separate fragment here, because its size can change
|
||||
// during relaxation.
|
||||
MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData());
|
||||
|
||||
SmallString<128> Code;
|
||||
@@ -217,6 +225,21 @@ void MCObjectStreamer::EmitInstToFragment(const MCInst &Inst) {
|
||||
IF->getContents().append(Code.begin(), Code.end());
|
||||
}
|
||||
|
||||
const char *BundlingNotImplementedMsg =
|
||||
"Aligned bundling is not implemented for this object format";
|
||||
|
||||
void MCObjectStreamer::EmitBundleAlignMode(unsigned AlignPow2) {
|
||||
llvm_unreachable(BundlingNotImplementedMsg);
|
||||
}
|
||||
|
||||
void MCObjectStreamer::EmitBundleLock() {
|
||||
llvm_unreachable(BundlingNotImplementedMsg);
|
||||
}
|
||||
|
||||
void MCObjectStreamer::EmitBundleUnlock() {
|
||||
llvm_unreachable(BundlingNotImplementedMsg);
|
||||
}
|
||||
|
||||
void MCObjectStreamer::EmitDwarfAdvanceLineAddr(int64_t LineDelta,
|
||||
const MCSymbol *LastLabel,
|
||||
const MCSymbol *Label,
|
||||
|
Reference in New Issue
Block a user