Skip to content

Commit d12919a

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 76a3be7 commit d12919a

File tree

6 files changed

+1356
-4557
lines changed

6 files changed

+1356
-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,
@@ -240,6 +244,9 @@ class Target {
240244
using AsmTargetStreamerCtorTy = MCTargetStreamer *(*)(
241245
MCStreamer &S, formatted_raw_ostream &OS, MCInstPrinter *InstPrint,
242246
bool IsVerboseAsm);
247+
using HexTargetStreamerCtorTy =
248+
MCTargetStreamer *(*)(MCStreamer &S, formatted_raw_ostream &OS,
249+
MCInstPrinter *InstPrint);
243250
using ObjectTargetStreamerCtorTy = MCTargetStreamer *(*)(
244251
MCStreamer &S, const MCSubtargetInfo &STI);
245252
using MCRelocationInfoCtorTy = MCRelocationInfo *(*)(const Triple &TT,
@@ -352,6 +359,10 @@ class Target {
352359
/// registered (default = nullptr).
353360
AsmTargetStreamerCtorTy AsmTargetStreamerCtorFn = nullptr;
354361

362+
/// Construction function for this target's hex TargetStreamer, if
363+
/// registered (default = nullptr).
364+
HexTargetStreamerCtorTy HexTargetStreamerCtorFn = nullptr;
365+
355366
/// Construction function for this target's obj TargetStreamer, if
356367
/// registered (default = nullptr).
357368
ObjectTargetStreamerCtorTy ObjectTargetStreamerCtorFn = nullptr;
@@ -680,6 +691,26 @@ class Target {
680691
return nullptr;
681692
}
682693

694+
MCStreamer *createHexStreamer(MCContext &Ctx,
695+
std::unique_ptr<formatted_raw_ostream> OS,
696+
MCInstPrinter *InstPrint,
697+
std::unique_ptr<MCCodeEmitter> &&CE,
698+
std::unique_ptr<MCAsmBackend> &&TAB) const {
699+
formatted_raw_ostream &OSRef = *OS;
700+
MCStreamer *S = llvm::createHexStreamer(Ctx, std::move(OS), InstPrint,
701+
std::move(CE), std::move(TAB));
702+
createHexTargetStreamer(*S, OSRef, InstPrint);
703+
return S;
704+
}
705+
706+
MCTargetStreamer *createHexTargetStreamer(MCStreamer &S,
707+
formatted_raw_ostream &OS,
708+
MCInstPrinter *InstPrint) const {
709+
if (HexTargetStreamerCtorFn)
710+
return HexTargetStreamerCtorFn(S, OS, InstPrint);
711+
return nullptr;
712+
}
713+
683714
/// createMCRelocationInfo - Create a target specific MCRelocationInfo.
684715
///
685716
/// \param TT The target triple.
@@ -1058,6 +1089,11 @@ struct TargetRegistry {
10581089
T.AsmTargetStreamerCtorFn = Fn;
10591090
}
10601091

1092+
static void RegisterHexTargetStreamer(Target &T,
1093+
Target::HexTargetStreamerCtorTy Fn) {
1094+
T.HexTargetStreamerCtorFn = Fn;
1095+
}
1096+
10611097
static void
10621098
RegisterObjectTargetStreamer(Target &T,
10631099
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: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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/MC/MCAsmBackend.h"
10+
#include "llvm/MC/MCAssembler.h"
11+
#include "llvm/MC/MCCodeEmitter.h"
12+
#include "llvm/MC/MCInstPrinter.h"
13+
#include "llvm/MC/MCObjectWriter.h"
14+
#include "llvm/MC/MCStreamer.h"
15+
#include "llvm/MC/TargetRegistry.h"
16+
17+
using namespace llvm;
18+
19+
namespace {
20+
21+
class MCHexStreamer final : public MCStreamer {
22+
std::unique_ptr<formatted_raw_ostream> OSOwner;
23+
formatted_raw_ostream &OS;
24+
std::unique_ptr<MCInstPrinter> InstPrinter;
25+
std::unique_ptr<MCAssembler> Assembler;
26+
27+
raw_null_ostream NullStream;
28+
29+
public:
30+
MCHexStreamer(MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
31+
MCInstPrinter *printer, std::unique_ptr<MCCodeEmitter> emitter,
32+
std::unique_ptr<MCAsmBackend> asmbackend)
33+
: MCStreamer(Context), OSOwner(std::move(os)), OS(*OSOwner),
34+
InstPrinter(printer),
35+
Assembler(std::make_unique<MCAssembler>(
36+
Context, std::move(asmbackend), std::move(emitter),
37+
asmbackend ? asmbackend->createObjectWriter(NullStream)
38+
: nullptr)) {
39+
assert(InstPrinter);
40+
}
41+
42+
MCAssembler &getAssembler() { return *Assembler; }
43+
44+
/// @name MCStreamer Interface
45+
/// @{
46+
47+
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
48+
return true;
49+
}
50+
51+
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
52+
Align ByteAlignment) override {}
53+
54+
void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
55+
uint64_t Size = 0, Align ByteAlignment = Align(1),
56+
SMLoc Loc = SMLoc()) override {}
57+
58+
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
59+
};
60+
61+
} // end anonymous namespace.
62+
63+
void MCHexStreamer::emitInstruction(const MCInst &Inst,
64+
const MCSubtargetInfo &STI) {
65+
SmallString<256> Code;
66+
SmallVector<MCFixup, 4> Fixups;
67+
getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
68+
69+
OS << "[";
70+
for (auto [I, B] : enumerate(Code))
71+
OS << (I != 0 ? "," : "") << format("0x%02x", B & 0xff);
72+
OS << "] #";
73+
74+
if (getTargetStreamer())
75+
getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
76+
else
77+
InstPrinter->printInst(&Inst, 0, "", STI, OS);
78+
79+
OS << "\n";
80+
}
81+
82+
MCStreamer *llvm::createHexStreamer(MCContext &Context,
83+
std::unique_ptr<formatted_raw_ostream> OS,
84+
MCInstPrinter *IP,
85+
std::unique_ptr<MCCodeEmitter> &&CE,
86+
std::unique_ptr<MCAsmBackend> &&MAB) {
87+
return new MCHexStreamer(Context, std::move(OS), IP, std::move(CE),
88+
std::move(MAB));
89+
}

0 commit comments

Comments
 (0)