Add support for forward declarations

This commit is contained in:
ReinUsesLisp 2021-02-14 22:45:31 -03:00
parent c374bfd9fd
commit f819ade0ef
2 changed files with 19 additions and 0 deletions

View File

@ -35,6 +35,10 @@ struct Id {
std::uint32_t value; std::uint32_t value;
}; };
[[nodiscard]] inline bool ValidId(Id id) noexcept {
return id.value != 0;
}
class Module { class Module {
public: public:
explicit Module(std::uint32_t version = spv::Version); explicit Module(std::uint32_t version = spv::Version);
@ -83,6 +87,12 @@ public:
AddExecutionMode(entry_point, mode, std::span<const Literal>({literals...})); AddExecutionMode(entry_point, mode, std::span<const Literal>({literals...}));
} }
/// Generate a new id for forward declarations
[[nodiscard]] Id ForwardDeclarationId();
/// Assign a new id and return the old one, useful for defining forward declarations
Id ExchangeCurrentId(Id new_current_id);
/** /**
* Adds an existing label to the code * Adds an existing label to the code
* @param label Label to insert into code. * @param label Label to insert into code.

View File

@ -95,6 +95,15 @@ void Module::AddExecutionMode(Id entry_point, spv::ExecutionMode mode,
*execution_modes << spv::Op::OpExecutionMode << entry_point << mode << literals << EndOp{}; *execution_modes << spv::Op::OpExecutionMode << entry_point << mode << literals << EndOp{};
} }
Id Module::ForwardDeclarationId() {
return Id{++bound};
}
Id Module::ExchangeCurrentId(Id new_current_id) {
const std::uint32_t old_id = std::exchange(bound, new_current_id.value - 1);
return Id{old_id + 1};
}
Id Module::AddLabel(Id label) { Id Module::AddLabel(Id label) {
assert(label.value != 0); assert(label.value != 0);
code->Reserve(2); code->Reserve(2);