Skip to content

Commit cbbc9b5

Browse files
committed
Address reviewer feedback.
1 parent 1280232 commit cbbc9b5

File tree

4 files changed

+19
-137
lines changed

4 files changed

+19
-137
lines changed

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ AMDGPUDisassembler::AMDGPUDisassembler(const MCSubtargetInfo &STI,
5555
report_fatal_error("Disassembly not yet supported for subtarget");
5656

5757
for (auto [Symbol, Code] : AMDGPU::UCVersion::getGFXVersions())
58-
UCVersionSymbols.push_back(createConstantSymbolExpr(Symbol, Code));
58+
createConstantSymbolExpr(Symbol, Code);
5959

6060
UCVersionW64Expr = createConstantSymbolExpr("UC_VERSION_W64_BIT", 0x2000);
6161
UCVersionW32Expr = createConstantSymbolExpr("UC_VERSION_W32_BIT", 0x4000);
@@ -1755,25 +1755,18 @@ MCOperand AMDGPUDisassembler::decodeVersionImm(unsigned Imm) const {
17551755
if (Encoding::encode(Version, W64, W32, MDP) != Imm)
17561756
return MCOperand::createImm(Imm);
17571757

1758-
// Locate UC_VERSION symbol matching Version.
1758+
const auto &Versions = AMDGPU::UCVersion::getGFXVersions();
1759+
auto I = find_if(Versions,
1760+
[Version = Version](const AMDGPU::UCVersion::GFXVersion &V) {
1761+
return V.Code == Version;
1762+
});
17591763
MCContext &Ctx = getContext();
1760-
const MCExpr *E = nullptr;
1761-
for (auto *VersionSym : UCVersionSymbols) {
1762-
int64_t Val;
1763-
if (!VersionSym->evaluateAsAbsolute(Val))
1764-
continue;
1765-
if (Val != (int64_t)Version)
1766-
continue;
1767-
auto *Sym = Ctx.getOrCreateSymbol(VersionSym->getSymbol().getName());
1768-
E = MCSymbolRefExpr::create(Sym, Ctx);
1769-
break;
1770-
}
1771-
1772-
// Default to constant value if not found.
1773-
if (!E)
1764+
const MCExpr *E;
1765+
if (I == Versions.end())
17741766
E = MCConstantExpr::create(Version, Ctx);
1767+
else
1768+
E = MCSymbolRefExpr::create(Ctx.getOrCreateSymbol(I->Symbol), Ctx);
17751769

1776-
// Apply bits.
17771770
if (W64)
17781771
E = MCBinaryExpr::createOr(E, UCVersionW64Expr, Ctx);
17791772
if (W32)
@@ -2369,17 +2362,17 @@ Expected<bool> AMDGPUDisassembler::onSymbolStart(SymbolInfoTy &Symbol,
23692362
return false;
23702363
}
23712364

2372-
const MCSymbolRefExpr *
2373-
AMDGPUDisassembler::createConstantSymbolExpr(StringRef Id, int64_t Val) {
2365+
const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(StringRef Id,
2366+
int64_t Val) {
23742367
MCContext &Ctx = getContext();
23752368
MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
2376-
// Note: only set value to Val on a new symbol.
2377-
// Existing symbol may potentially have a different value to the one
2378-
// requested, which allows for user redefinition of symbols.
2379-
if (!Sym->isVariable()) {
2380-
Sym->setRedefinable(true);
2369+
// Note: only set value to Val on a new symbol in case an dissassembler
2370+
// has already been initialized in this context.
2371+
[[maybe_unused]] int64_t Res = ~Val;
2372+
assert(!Sym->isVariable() ||
2373+
(Sym->getVariableValue()->evaluateAsAbsolute(Res) && Res == Val));
2374+
if (!Sym->isVariable())
23812375
Sym->setVariableValue(MCConstantExpr::create(Val, Ctx));
2382-
}
23832376
return MCSymbolRefExpr::create(Sym, Ctx);
23842377
}
23852378

llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ class MCAsmInfo;
3030
class MCInst;
3131
class MCOperand;
3232
class MCSubtargetInfo;
33-
class MCSymbolRefExpr;
3433
class Twine;
3534

3635
// Exposes an interface expected by autogenerated code in
@@ -106,9 +105,8 @@ class AMDGPUDisassembler : public MCDisassembler {
106105
const MCExpr *UCVersionW64Expr;
107106
const MCExpr *UCVersionW32Expr;
108107
const MCExpr *UCVersionMDPExpr;
109-
SmallVector<const MCSymbolRefExpr *> UCVersionSymbols;
110108

111-
const MCSymbolRefExpr *createConstantSymbolExpr(StringRef Id, int64_t Val);
109+
const MCExpr *createConstantSymbolExpr(StringRef Id, int64_t Val);
112110

113111
public:
114112
AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx,

llvm/test/MC/AMDGPU/custom-uc-version.s

Lines changed: 0 additions & 41 deletions
This file was deleted.

llvm/unittests/MC/AMDGPU/Disassembler.cpp

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -132,71 +132,3 @@ TEST(AMDGPUDisassembler, MultiDisassembler) {
132132
StrBuffer[InsnStr.size()] = '\0';
133133
EXPECT_EQ(StringRef(StrBuffer), "\ts_version UC_VERSION_GFX10");
134134
}
135-
136-
// Test UC_VERSION symbols can be overriden.
137-
TEST(AMDGPUDisassembler, UCVersionOverride) {
138-
LLVMInitializeAMDGPUTargetInfo();
139-
LLVMInitializeAMDGPUTargetMC();
140-
LLVMInitializeAMDGPUDisassembler();
141-
142-
std::string Error;
143-
const Target *TheTarget = TargetRegistry::lookupTarget(TripleName, Error);
144-
145-
// Skip test if AMDGPU not built.
146-
if (!TheTarget)
147-
GTEST_SKIP();
148-
149-
std::unique_ptr<MCRegisterInfo> MRI(TheTarget->createMCRegInfo(TripleName));
150-
std::unique_ptr<MCAsmInfo> MAI(
151-
TheTarget->createMCAsmInfo(*MRI, TripleName, MCTargetOptions()));
152-
std::unique_ptr<const MCInstrInfo> MII(TheTarget->createMCInstrInfo());
153-
std::unique_ptr<MCSubtargetInfo> STI(
154-
TheTarget->createMCSubtargetInfo(TripleName, CPUName, ""));
155-
auto Ctx = std::make_unique<MCContext>(Triple(TripleName), MAI.get(),
156-
MRI.get(), STI.get());
157-
158-
// Define custom UC_VERSION before initializing disassembler.
159-
const uint8_t UC_VERSION_GFX10_DEFAULT = 0x04;
160-
const uint8_t UC_VERSION_GFX10_NEW = 0x99;
161-
auto Sym = Ctx->getOrCreateSymbol("UC_VERSION_GFX10");
162-
Sym->setVariableValue(MCConstantExpr::create(UC_VERSION_GFX10_NEW, *Ctx));
163-
164-
int AsmPrinterVariant = MAI->getAssemblerDialect();
165-
std::unique_ptr<MCInstPrinter> IP(TheTarget->createMCInstPrinter(
166-
Triple(TripleName), AsmPrinterVariant, *MAI, *MII, *MRI));
167-
168-
std::unique_ptr<MCDisassembler> DisAsm(
169-
TheTarget->createMCDisassembler(*STI, *Ctx));
170-
171-
SmallVector<char, 64> InsnStr, AnnoStr;
172-
raw_svector_ostream OS(InsnStr);
173-
raw_svector_ostream Annotations(AnnoStr);
174-
formatted_raw_ostream FormattedOS(OS);
175-
176-
char StrBuffer[128];
177-
178-
// Decode S_VERSION instruction with original or custom version.
179-
uint8_t Versions[] = {UC_VERSION_GFX10_DEFAULT, UC_VERSION_GFX10_NEW};
180-
for (uint8_t Version : Versions) {
181-
uint8_t Bytes[] = {Version, 0x00, 0x80, 0xb0};
182-
size_t InstSize = 0U;
183-
MCInst Inst;
184-
185-
AnnoStr.clear();
186-
InsnStr.clear();
187-
MCDisassembler::DecodeStatus Status =
188-
DisAsm->getInstruction(Inst, InstSize, Bytes, 0, Annotations);
189-
ASSERT_TRUE(Status == MCDisassembler::Success);
190-
EXPECT_EQ(InstSize, 4U);
191-
192-
IP->printInst(&Inst, 0, Annotations.str(), *STI, FormattedOS);
193-
ASSERT_TRUE(InsnStr.size() < (sizeof(StrBuffer) - 1));
194-
std::memcpy(StrBuffer, InsnStr.data(), InsnStr.size());
195-
StrBuffer[InsnStr.size()] = '\0';
196-
197-
if (Version == UC_VERSION_GFX10_DEFAULT)
198-
EXPECT_EQ(StringRef(StrBuffer), "\ts_version 4");
199-
else
200-
EXPECT_EQ(StringRef(StrBuffer), "\ts_version UC_VERSION_GFX10");
201-
}
202-
}

0 commit comments

Comments
 (0)