Skip to content

Commit 9781132

Browse files
committed
[AMDGPU][RFC] Combine asm and disasm tests.
Eliminates the need to replicate the same instructions in MC and MC/Disassembler tests and synchronize changes in them. Also highlights differences between disassembled, reassembled and original instructions.
1 parent 6fa0961 commit 9781132

File tree

6 files changed

+1358
-4557
lines changed

6 files changed

+1358
-4557
lines changed

llvm/include/llvm/MC/TargetRegistry.h

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ createAsmStreamer(MCContext &Ctx, std::unique_ptr<formatted_raw_ostream> OS,
8888
bool isVerboseAsm, bool useDwarfDirectory,
8989
MCInstPrinter *InstPrint, std::unique_ptr<MCCodeEmitter> &&CE,
9090
std::unique_ptr<MCAsmBackend> &&TAB, bool ShowInst);
91-
91+
MCStreamer *createHexStreamer(MCContext &Ctx,
92+
std::unique_ptr<formatted_raw_ostream> OS,
93+
MCInstPrinter *InstPrint,
94+
std::unique_ptr<MCCodeEmitter> &&CE,
95+
std::unique_ptr<MCAsmBackend> &&TAB);
9296
MCStreamer *createELFStreamer(MCContext &Ctx,
9397
std::unique_ptr<MCAsmBackend> &&TAB,
9498
std::unique_ptr<MCObjectWriter> &&OW,
@@ -234,6 +238,9 @@ class Target {
234238
using AsmTargetStreamerCtorTy = MCTargetStreamer *(*)(
235239
MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint,
236240
bool IsVerboseAsm);
241+
using HexTargetStreamerCtorTy =
242+
MCTargetStreamer *(*)(MCStreamer &S, formatted_raw_ostream &OS,
243+
MCInstPrinter *InstPrint);
237244
using ObjectTargetStreamerCtorTy = MCTargetStreamer *(*)(
238245
MCStreamer &S, const MCSubtargetInfo &STI);
239246
using MCRelocationInfoCtorTy = MCRelocationInfo *(*)(const Triple &TT,
@@ -346,6 +353,10 @@ class Target {
346353
/// registered (default = nullptr).
347354
AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn = nullptr;
348355

356+
/// Construction function for this target's hex TargetStreamer, if
357+
/// registered (default = nullptr).
358+
HexTargetStreamerCtorTy HexTargetStreamerCtorFn = nullptr;
359+
349360
/// Construction function for this target's obj TargetStreamer, if
350361
/// registered (default = nullptr).
351362
ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn = nullptr;
@@ -671,6 +682,26 @@ class Target {
671682
return nullptr;
672683
}
673684

685+
MCStreamer *createHexStreamer(MCContext &Ctx,
686+
std::unique_ptr<formatted_raw_ostream> OS,
687+
MCInstPrinter *InstPrint,
688+
std::unique_ptr<MCCodeEmitter> &&CE,
689+
std::unique_ptr<MCAsmBackend> &&TAB) const {
690+
formatted_raw_ostream &OSRef = *OS;
691+
MCStreamer *S = llvm::createHexStreamer(Ctx, std::move(OS), InstPrint,
692+
std::move(CE), std::move(TAB));
693+
createHexTargetStreamer(*S, OSRef, InstPrint);
694+
return S;
695+
}
696+
697+
MCTargetStreamer *createHexTargetStreamer(MCStreamer &S,
698+
formatted_raw_ostream &OS,
699+
MCInstPrinter *InstPrint) const {
700+
if (HexTargetStreamerCtorFn)
701+
return HexTargetStreamerCtorFn(S, OS, InstPrint);
702+
return nullptr;
703+
}
704+
674705
/// createMCRelocationInfo - Create a target specific MCRelocationInfo.
675706
///
676707
/// \param TT The target triple.
@@ -1049,6 +1080,11 @@ struct TargetRegistry {
10491080
T.AsmTargetStreamerCtorFn = Fn;
10501081
}
10511082

1083+
static void RegisterHexTargetStreamer(Target &T,
1084+
Target::HexTargetStreamerCtorTy Fn) {
1085+
T.HexTargetStreamerCtorFn = Fn;
1086+
}
1087+
10521088
static void
10531089
RegisterObjectTargetStreamer(Target &T,
10541090
Target::ObjectTargetStreamerCtorTy Fn) {

llvm/lib/MC/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ add_llvm_component_library(LLVMMC
2525
MCExpr.cpp
2626
MCFragment.cpp
2727
MCGOFFStreamer.cpp
28+
MCHexStreamer.cpp
2829
MCInst.cpp
2930
MCInstPrinter.cpp
3031
MCInstrAnalysis.cpp

llvm/lib/MC/MCHexStreamer.cpp

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//===- lib/MC/MCHexStreamer.cpp - Hex Output --------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "llvm/ADT/StringExtras.h"
10+
#include "llvm/MC/MCAsmBackend.h"
11+
#include "llvm/MC/MCAssembler.h"
12+
#include "llvm/MC/MCCodeEmitter.h"
13+
#include "llvm/MC/MCInstPrinter.h"
14+
#include "llvm/MC/MCObjectWriter.h"
15+
#include "llvm/MC/MCStreamer.h"
16+
#include "llvm/MC/TargetRegistry.h"
17+
18+
using namespace llvm;
19+
20+
namespace {
21+
22+
class MCHexStreamer final : public MCStreamer {
23+
std::unique_ptr<formatted_raw_ostream> OSOwner;
24+
formatted_raw_ostream &OS;
25+
std::unique_ptr<MCInstPrinter> InstPrinter;
26+
std::unique_ptr<MCAssembler> Assembler;
27+
28+
raw_null_ostream NullStream;
29+
30+
public:
31+
MCHexStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
32+
MCInstPrinter *printer, std::unique_ptr<MCCodeEmitter> emitter,
33+
std::unique_ptr<MCAsmBackend> asmbackend)
34+
: MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),
35+
InstPrinter(printer),
36+
Assembler(std::make_unique<MCAssembler>(
37+
Context, std::move(asmbackend), std::move(emitter),
38+
asmbackend ? asmbackend->createObjectWriter(NullStream)
39+
: nullptr)) {
40+
assert(InstPrinter);
41+
}
42+
43+
MCAssembler &getAssembler() { return *Assembler; }
44+
45+
/// @name MCStreamer Interface
46+
/// @{
47+
48+
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
49+
return true;
50+
}
51+
52+
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
53+
Align ByteAlignment) override {}
54+
55+
void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
56+
uint64_t Size = 0, Align ByteAlignment = Align(1),
57+
SMLoc Loc = SMLoc()) override {}
58+
59+
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
60+
};
61+
62+
} // end anonymous namespace.
63+
64+
void MCHexStreamer::emitInstruction(const MCInst &Inst,
65+
const MCSubtargetInfo &STI) {
66+
SmallString<256> Code;
67+
SmallVector<MCFixup, 4> Fixups;
68+
getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
69+
70+
OS << '[';
71+
ListSeparator LS;
72+
for (auto [I, B] : enumerate(Code))
73+
OS << LS << format("0x%02x", B & 0xff);
74+
OS << "] #";
75+
76+
if (getTargetStreamer())
77+
getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
78+
else
79+
InstPrinter->printInst(&Inst, 0, "", STI, OS);
80+
81+
OS << '\n';
82+
}
83+
84+
MCStreamer *llvm::createHexStreamer(MCContext &Context,
85+
std::unique_ptr<formatted_raw_ostream> OS,
86+
MCInstPrinter *IP,
87+
std::unique_ptr<MCCodeEmitter> &&CE,
88+
std::unique_ptr<MCAsmBackend> &&MAB) {
89+
return new MCHexStreamer(Context, std::move(OS), IP, std::move(CE),
90+
std::move(MAB));
91+
}

0 commit comments

Comments
 (0)