Skip to content

Commit 779593a

Browse files
committed
viam: Extract RegisterRef and add AbiRegister
This allows the UME definition to reuse the generic `RegisterRef` record.
1 parent 533c774 commit 779593a

7 files changed

Lines changed: 153 additions & 69 deletions

File tree

vadl/main/vadl/ast/ViamLowering.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,11 +2002,11 @@ public Optional<vadl.viam.Definition> visit(
20022002
}
20032003

20042004
/**
2005-
* Maps a {@link SpecialPurposeRegisterDefinition} to a {@link Abi.RegisterRef}.
2005+
* Maps a {@link SpecialPurposeRegisterDefinition} to a {@link Abi.AbiRegister}.
20062006
* It expects only one register in the {@link SpecialPurposeRegisterDefinition}. Otherwise,
20072007
* it will throw an error.
20082008
*/
2009-
private Abi.RegisterRef mapSingleSpecialPurposeRegisterDef(
2009+
private Abi.AbiRegister mapSingleSpecialPurposeRegisterDef(
20102010
Map<Identifier, Expr> aliasLookup,
20112011
SpecialPurposeRegisterDefinition specialPurposeRegisterDef) {
20122012
return specialPurposeRegisterDef.exprs.stream()
@@ -2015,9 +2015,9 @@ private Abi.RegisterRef mapSingleSpecialPurposeRegisterDef(
20152015
}
20162016

20172017
/**
2018-
* Maps a {@link SpecialPurposeRegisterDefinition} to a list of {@link Abi.RegisterRef}.
2018+
* Maps a {@link SpecialPurposeRegisterDefinition} to a list of {@link Abi.AbiRegister}.
20192019
*/
2020-
private List<Abi.RegisterRef> mapSpecialPurposeRegistersDef(
2020+
private List<Abi.AbiRegister> mapSpecialPurposeRegistersDef(
20212021
Map<Identifier, Expr> aliasLookup,
20222022
SpecialPurposeRegisterDefinition specialPurposeRegisterDef) {
20232023
return specialPurposeRegisterDef.exprs.stream()
@@ -2026,12 +2026,12 @@ private List<Abi.RegisterRef> mapSpecialPurposeRegistersDef(
20262026
}
20272027

20282028
/**
2029-
* Maps a {@link SpecialPurposeRegisterDefinition} to a list of {@link Abi.RegisterRef}.
2029+
* Maps a {@link SpecialPurposeRegisterDefinition} to a list of {@link Abi.AbiRegister}.
20302030
*/
2031-
private List<List<Abi.RegisterRef>> mapSpecialPurposeRegistersDefs(
2031+
private List<List<Abi.AbiRegister>> mapSpecialPurposeRegistersDefs(
20322032
Map<Identifier, Expr> aliasLookup,
20332033
List<SpecialPurposeRegisterDefinition> specialPurposeRegisterDefs) {
2034-
List<List<Abi.RegisterRef>> result = new ArrayList<>();
2034+
List<List<Abi.AbiRegister>> result = new ArrayList<>();
20352035

20362036
for (var def : specialPurposeRegisterDefs) {
20372037
var iter = def.exprs.stream()
@@ -2044,7 +2044,7 @@ private List<List<Abi.RegisterRef>> mapSpecialPurposeRegistersDefs(
20442044
return result;
20452045
}
20462046

2047-
private Abi.RegisterRef getRegisterRefByAliasOrRegister(
2047+
private Abi.AbiRegister getRegisterRefByAliasOrRegister(
20482048
Map<Identifier, Expr> aliasLookup,
20492049
ExpandedSequenceCallExpr aliasOrRegister) {
20502050
if (aliasOrRegister instanceof ExpandedAliasDefSequenceCallExpr registerCallExpr) {
@@ -2055,10 +2055,10 @@ private Abi.RegisterRef getRegisterRefByAliasOrRegister(
20552055
}
20562056

20572057
/**
2058-
* Maps the aliases {@code alias register zero = X(0)} to {@link Abi.RegisterRef} to be
2058+
* Maps the aliases {@code alias register zero = X(0)} to {@link Abi.AbiRegister} to be
20592059
* used in {@link Abi}.
20602060
*/
2061-
private Abi.RegisterRef mapAliasToRegisterRef(
2061+
private Abi.AbiRegister mapAliasToRegisterRef(
20622062
Map<Identifier, Expr> aliasLookup,
20632063
Identifier identifier) {
20642064
var expr = ensureNonNull(aliasLookup.get(identifier),
@@ -2067,12 +2067,12 @@ private Abi.RegisterRef mapAliasToRegisterRef(
20672067
return mapToRegisterRef(expr);
20682068
}
20692069

2070-
private Abi.RegisterRef mapToRegisterRef(Expr expr) {
2070+
private Abi.AbiRegister mapToRegisterRef(Expr expr) {
20712071
var pair = getRegisterFile(expr);
20722072
var registerFile = pair.left();
20732073
var index = pair.right();
20742074

2075-
return new Abi.RegisterRef(registerFile, index, new Abi.Alignment(-1), expr.location());
2075+
return new Abi.AbiRegister(registerFile, index, new Abi.Alignment(-1), expr.location());
20762076
}
20772077

20782078
/**

vadl/main/vadl/lcb/template/lib/Target/EmitCallingConvTableGenFilePass.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
1+
// SPDX-FileCopyrightText : © 2025-2026 TU Wien <vadl@tuwien.ac.at>
22
// SPDX-License-Identifier: GPL-3.0-or-later
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -79,7 +79,7 @@ protected Map<String, Object> createVariables(final PassResults passResults,
7979
var abi = specification.abi().orElseThrow();
8080
return Map.of(CommonVarNames.NAMESPACE,
8181
lcbConfiguration().targetName().value().toLowerCase(),
82-
"calleeRegisters", abi.calleeSaved().stream().map(Abi.RegisterRef::render).toList(),
82+
"calleeRegisters", abi.calleeSaved().stream().map(Abi.AbiRegister::render).toList(),
8383
"functionRegisterType", getFuncArgsAssignToReg(abi).type,
8484
"functionRegisters", getFuncArgsAssignToReg(abi),
8585
"returnIfTypes", returnIfTypes(abi));
@@ -90,7 +90,7 @@ private List<ReturnCCIfType> returnIfTypes(Abi abi) {
9090

9191
for (var def : abi.returnRegisters()) {
9292
var ty = ValueType.from(def.get(0).registerFile().resultType()).get();
93-
var regs = def.stream().map(Abi.RegisterRef::render).toList();
93+
var regs = def.stream().map(Abi.AbiRegister::render).toList();
9494
var obj = new ReturnCCIfType(ty, regs);
9595
result.add(obj);
9696
}
@@ -106,7 +106,7 @@ private AssignToReg getFuncArgsAssignToReg(Abi abi) {
106106
return new AssignToReg(
107107
ValueType.from(abi.argumentRegisters().get(0).registerFile().resultType()).get()
108108
.getLlvmType(),
109-
abi.argumentRegisters().stream().map(Abi.RegisterRef::render)
109+
abi.argumentRegisters().stream().map(Abi.AbiRegister::render)
110110
.collect(Collectors.joining(", ")));
111111
}
112112
}

vadl/main/vadl/lcb/template/lib/Target/EmitISelLoweringCppFilePass.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
1+
// SPDX-FileCopyrightText : © 2025-2026 TU Wien <vadl@tuwien.ac.at>
22
// SPDX-License-Identifier: GPL-3.0-or-later
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -175,10 +175,10 @@ protected Map<String, Object> createVariables(final PassResults passResults,
175175
map.put("stackPointer", stackPointer);
176176
map.put("stackPointerByteSize", abi.stackPointer().registerFile().resultType().bitWidth() / 8);
177177
map.put("argumentRegisterClasses",
178-
abi.argumentRegisters().stream().map(Abi.RegisterRef::registerFile).distinct()
178+
abi.argumentRegisters().stream().map(Abi.AbiRegister::registerFile).distinct()
179179
.map(LlvmRegisterFile::new).map(this::mapLlvmRegisterClass).toList());
180180
map.put("argumentRegisters",
181-
abi.argumentRegisters().stream().map(Abi.RegisterRef::render).toList());
181+
abi.argumentRegisters().stream().map(Abi.AbiRegister::render).toList());
182182
map.put("stackPointerBitWidth", abi.stackPointer().registerFile().resultType().bitWidth());
183183
map.put("stackPointerType", stackPointerType.getLlvmType());
184184
map.put("absoluteAddressLoadInstruction",

vadl/main/vadl/lcb/template/lib/Target/EmitRegisterInfoCppFilePass.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
1+
// SPDX-FileCopyrightText : © 2025-2026 TU Wien <vadl@tuwien.ac.at>
22
// SPDX-License-Identifier: GPL-3.0-or-later
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -124,8 +124,8 @@ protected Map<String, Object> createVariables(final PassResults passResults,
124124
"returnAddress", abi.returnAddress().render(),
125125
"stackPointer", abi.stackPointer().render(),
126126
"hasThreadPointer", abi.threadPointer().isPresent(),
127-
"threadPointer", abi.threadPointer().map(Abi.RegisterRef::render).orElse(""),
128-
"globalPointer", abi.globalPointer().map(Abi.RegisterRef::render).orElse(""),
127+
"threadPointer", abi.threadPointer().map(Abi.AbiRegister::render).orElse(""),
128+
"globalPointer", abi.globalPointer().map(Abi.AbiRegister::render).orElse(""),
129129
"frameIndexEliminations",
130130
getEliminateFrameIndexEntries(instructionLabels, uninlined,
131131
tableGenMachineInstructions).stream()

vadl/main/vadl/lcb/template/lib/Target/EmitRegisterInfoTableGenFilePass.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
1+
// SPDX-FileCopyrightText : © 2025-2026 TU Wien <vadl@tuwien.ac.at>
22
// SPDX-License-Identifier: GPL-3.0-or-later
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -90,7 +90,7 @@ protected Map<String, Object> createVariables(final PassResults passResults,
9090

9191
// The order of registers represents the preferred allocation sequence.
9292
// Registers are listed in the order caller-save, callee-save, specials.
93-
var callerSaved = abi.callerSaved().stream().map(Abi.RegisterRef::render).toList();
93+
var callerSaved = abi.callerSaved().stream().map(Abi.AbiRegister::render).toList();
9494
verifyAllTheSameRegisterFile(abi.callerSaved());
9595
verifyAllTheSameRegisterFile(abi.calleeSaved());
9696
verifyBothTheSame(abi.calleeSaved(), abi.callerSaved());
@@ -99,13 +99,13 @@ protected Map<String, Object> createVariables(final PassResults passResults,
9999
var exceptions = new HashSet<>(Stream.of(
100100
Optional.of(abi.returnAddress().render()),
101101
Optional.of(abi.stackPointer().render()),
102-
abi.globalPointer().map(Abi.RegisterRef::render),
102+
abi.globalPointer().map(Abi.AbiRegister::render),
103103
Optional.of(abi.framePointer().render()),
104-
abi.threadPointer().map(Abi.RegisterRef::render)
104+
abi.threadPointer().map(Abi.AbiRegister::render)
105105
).filter(Optional::isPresent).map(Optional::get).toList());
106106

107107
var calleeSaved = abi.calleeSaved().stream()
108-
.map(Abi.RegisterRef::render)
108+
.map(Abi.AbiRegister::render)
109109
.filter(render -> !exceptions.contains(render))
110110
.toList();
111111

@@ -181,8 +181,8 @@ protected Map<String, Object> createVariables(final PassResults passResults,
181181
);
182182
}
183183

184-
private void verifyBothTheSame(List<Abi.RegisterRef> calleeSaved,
185-
List<Abi.RegisterRef> callerSaved) {
184+
private void verifyBothTheSame(List<Abi.AbiRegister> calleeSaved,
185+
List<Abi.AbiRegister> callerSaved) {
186186
if (!callerSaved.isEmpty() && !calleeSaved.isEmpty()) {
187187
var callerRegFile = getRegisterFile(callerSaved.getFirst().registerFile());
188188
var calleeRegFile = getRegisterFile(calleeSaved.getFirst().registerFile());
@@ -206,13 +206,13 @@ private Resource getRegisterFile(RegisterResource registerResource) {
206206
return registerResource;
207207
}
208208

209-
private void verifyAllTheSameRegisterFile(List<Abi.RegisterRef> registerRefs) {
209+
private void verifyAllTheSameRegisterFile(List<Abi.AbiRegister> registerRefs) {
210210
var set = registerRefs.stream().map(ref -> getRegisterFile(ref.registerFile()))
211211
.collect(Collectors.toSet());
212212

213213
if (set.size() > 1) {
214214
throw Diagnostic.error("All register must have the same register file.",
215-
registerRefs.stream().map(Abi.RegisterRef::location)
215+
registerRefs.stream().map(Abi.AbiRegister::location)
216216
.reduce(registerRefs.get(0).location(),
217217
SourceLocation::join).location()).build();
218218
}

vadl/main/vadl/viam/Abi.java

Lines changed: 67 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText : © 2025 TU Wien <vadl@tuwien.ac.at>
1+
// SPDX-FileCopyrightText : © 2025-2026 TU Wien <vadl@tuwien.ac.at>
22
// SPDX-License-Identifier: GPL-3.0-or-later
33
//
44
// This program is free software: you can redistribute it and/or modify
@@ -21,6 +21,7 @@
2121
import java.util.Optional;
2222
import vadl.utils.Pair;
2323
import vadl.utils.SourceLocation;
24+
import vadl.utils.WithLocation;
2425

2526
/**
2627
* VADL ABI representation.
@@ -190,19 +191,47 @@ public ClangType(ClangType.TypeName typeName, ClangType.TypeSize size, SourceLoc
190191
}
191192

192193
/**
193-
* Constructor.
194+
* ABI-specific register role.
194195
*
195-
* @param registerFile is the "parent" of the register.
196-
* @param addr represents the index in a register file.
197-
* E.g., RISC-V's X11 would have {@code addr = 11}.
198-
* @param alignment for the spilling of the register.
196+
* @param registerRef semantic register reference
197+
* @param alignment for the spilling of the register
199198
*/
200-
public record RegisterRef(RegisterResource registerFile,
201-
int addr,
202-
Alignment alignment,
203-
SourceLocation location) {
199+
public record AbiRegister(RegisterRef registerRef,
200+
Alignment alignment) implements WithLocation {
201+
202+
/**
203+
* Constructs an ABI register role from the historical single-index representation.
204+
*/
205+
public AbiRegister(RegisterResource registerFile,
206+
int addr,
207+
Alignment alignment,
208+
SourceLocation location) {
209+
this(new RegisterRef(registerFile,
210+
List.of(Constant.Value.of(addr, registerFile.indexTypes().getFirst())),
211+
location), alignment);
212+
}
213+
214+
public RegisterResource registerFile() {
215+
return registerRef.resource();
216+
}
217+
218+
public int addr() {
219+
return registerRef.singleIndex();
220+
}
221+
222+
@Override
223+
public SourceLocation location() {
224+
return registerRef.location();
225+
}
226+
227+
/**
228+
* Render the compiler register name.
229+
*
230+
* <p>This is kept temporarily for the existing LCB emitters. Rendering should move to the
231+
* respective backend later.</p>
232+
*/
204233
public String render() {
205-
return registerFile.generateRegisterFileName(addr);
234+
return registerFile().generateRegisterFileName(addr());
206235
}
207236
}
208237

@@ -213,18 +242,18 @@ public record RegisterAlias(String value) {
213242
}
214243

215244

216-
private final RegisterRef returnAddress;
217-
private final RegisterRef stackPointer;
218-
private final Optional<RegisterRef> globalPointer;
219-
private final RegisterRef framePointer;
220-
private final Optional<RegisterRef> threadPointer;
245+
private final AbiRegister returnAddress;
246+
private final AbiRegister stackPointer;
247+
private final Optional<AbiRegister> globalPointer;
248+
private final AbiRegister framePointer;
249+
private final Optional<AbiRegister> threadPointer;
221250

222251

223252
private final Map<Pair<RegisterResource, Integer>, List<RegisterAlias>> aliases;
224-
private final List<RegisterRef> callerSaved;
225-
private final List<RegisterRef> calleeSaved;
226-
private final List<RegisterRef> argumentRegisters;
227-
private final List<List<RegisterRef>> returnRegisters;
253+
private final List<AbiRegister> callerSaved;
254+
private final List<AbiRegister> calleeSaved;
255+
private final List<AbiRegister> argumentRegisters;
256+
private final List<List<AbiRegister>> returnRegisters;
228257
private final PrintableInstruction returnSequence;
229258
private final PrintableInstruction callSequence;
230259
private final Optional<PrintableInstruction> localAddressLoad;
@@ -248,16 +277,16 @@ public record RegisterAlias(String value) {
248277
* Constructor.
249278
*/
250279
public Abi(Identifier identifier,
251-
RegisterRef returnAddress,
252-
RegisterRef stackPointer,
253-
RegisterRef framePointer,
254-
Optional<RegisterRef> globalPointer,
255-
Optional<RegisterRef> threadPointer,
280+
AbiRegister returnAddress,
281+
AbiRegister stackPointer,
282+
AbiRegister framePointer,
283+
Optional<AbiRegister> globalPointer,
284+
Optional<AbiRegister> threadPointer,
256285
Map<Pair<RegisterResource, Integer>, List<RegisterAlias>> aliases,
257-
List<RegisterRef> callerSaved,
258-
List<RegisterRef> calleeSaved,
259-
List<RegisterRef> argumentRegisters,
260-
List<List<RegisterRef>> returnRegisters,
286+
List<AbiRegister> callerSaved,
287+
List<AbiRegister> calleeSaved,
288+
List<AbiRegister> argumentRegisters,
289+
List<List<AbiRegister>> returnRegisters,
261290
PrintableInstruction returnSequence,
262291
PrintableInstruction callSequence,
263292
Optional<PrintableInstruction> localAddressLoad,
@@ -300,43 +329,43 @@ public void accept(DefinitionVisitor visitor) {
300329
}
301330

302331

303-
public RegisterRef returnAddress() {
332+
public AbiRegister returnAddress() {
304333
return returnAddress;
305334
}
306335

307-
public RegisterRef stackPointer() {
336+
public AbiRegister stackPointer() {
308337
return stackPointer;
309338
}
310339

311-
public RegisterRef framePointer() {
340+
public AbiRegister framePointer() {
312341
return framePointer;
313342
}
314343

315-
public Optional<RegisterRef> globalPointer() {
344+
public Optional<AbiRegister> globalPointer() {
316345
return globalPointer;
317346
}
318347

319-
public Optional<RegisterRef> threadPointer() {
348+
public Optional<AbiRegister> threadPointer() {
320349
return threadPointer;
321350
}
322351

323352
public Map<Pair<RegisterResource, Integer>, List<RegisterAlias>> aliases() {
324353
return aliases;
325354
}
326355

327-
public List<RegisterRef> callerSaved() {
356+
public List<AbiRegister> callerSaved() {
328357
return callerSaved;
329358
}
330359

331-
public List<RegisterRef> calleeSaved() {
360+
public List<AbiRegister> calleeSaved() {
332361
return calleeSaved;
333362
}
334363

335-
public List<RegisterRef> argumentRegisters() {
364+
public List<AbiRegister> argumentRegisters() {
336365
return argumentRegisters;
337366
}
338367

339-
public List<List<RegisterRef>> returnRegisters() {
368+
public List<List<AbiRegister>> returnRegisters() {
340369
return returnRegisters;
341370
}
342371

0 commit comments

Comments
 (0)