2019-08-09 19:26:27 +08:00
|
|
|
//===--------------------- CodeEmitter.cpp ----------------------*- 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
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file implements the CodeEmitter API.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "llvm/MCA/CodeEmitter.h"
|
|
|
|
|
|
|
|
namespace llvm {
|
|
|
|
namespace mca {
|
|
|
|
|
|
|
|
CodeEmitter::EncodingInfo
|
|
|
|
CodeEmitter::getOrCreateEncodingInfo(unsigned MCID) {
|
|
|
|
EncodingInfo &EI = Encodings[MCID];
|
|
|
|
if (EI.second)
|
|
|
|
return EI;
|
|
|
|
|
|
|
|
SmallVector<llvm::MCFixup, 2> Fixups;
|
|
|
|
const MCInst &Inst = Sequence[MCID];
|
|
|
|
MCInst Relaxed(Sequence[MCID]);
|
|
|
|
if (MAB.mayNeedRelaxation(Inst, STI))
|
[MC][Bugfix] Remove redundant parameter for relaxInstruction
Summary:
Before this patch, `relaxInstruction` takes three arguments, the first
argument refers to the instruction before relaxation and the third
argument is the output instruction after relaxation. There are two quite
strange things:
1) The first argument's type is `const MCInst &`, the third
argument's type is `MCInst &`, but they may be aliased to the same
variable
2) The backends of ARM, AMDGPU, RISC-V, Hexagon assume that the third
argument is a fresh uninitialized `MCInst` even if `relaxInstruction`
may be called like `relaxInstruction(Relaxed, STI, Relaxed)` in a
loop.
In this patch, we drop the thrid argument, and let `relaxInstruction`
directly modify the given instruction. Also, this patch fixes the bug https://bugs.llvm.org/show_bug.cgi?id=45580, which is introduced by D77851, and
breaks the assumption of ARM, AMDGPU, RISC-V, Hexagon.
Reviewers: Razer6, MaskRay, jyknight, asb, luismarques, enderby, rtaylor, colinl, bcain
Reviewed By: Razer6, MaskRay, bcain
Subscribers: bcain, nickdesaulniers, nathanchance, wuzish, annita.zhang, arsenm, dschuff, jyknight, dylanmckay, sdardis, nemanjai, jvesely, nhaehnle, tpr, sbc100, jgravelle-google, kristof.beyls, hiraditya, aheejin, kbarton, fedor.sergeev, asb, rbar, johnrusso, simoncook, sabuasal, niosHD, jrtc27, MaskRay, zzheng, edward-jones, atanasyan, rogfer01, MartinMosbeck, brucehoult, the_o, PkmX, jocewei, Jim, lenary, s.egerton, pzheng, sameer.abuasal, apazos, luismarques, kerbowa, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D78364
2020-04-17 20:26:26 +08:00
|
|
|
MAB.relaxInstruction(Relaxed, STI);
|
2019-08-09 19:26:27 +08:00
|
|
|
|
|
|
|
EI.first = Code.size();
|
|
|
|
MCE.encodeInstruction(Relaxed, VecOS, Fixups, STI);
|
|
|
|
EI.second = Code.size() - EI.first;
|
|
|
|
return EI;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace mca
|
|
|
|
} // namespace llvm
|