From 64762ca227262eb2611dc0e0927f800169c57830 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Thu, 26 Mar 2026 20:00:16 +0000 Subject: [PATCH] hardens IRGlobal structural metadata for PBS lifecycle lowering --- .../compiler/pbs/PbsFrontendCompiler.java | 13 ++++ .../services/PBSFrontendPhaseService.java | 44 ++++++++++++- .../compiler/pbs/PbsFrontendCompilerTest.java | 6 ++ .../services/PBSFrontendPhaseServiceTest.java | 11 +++- .../backend/irvm/LowerToIRVMService.java | 10 +-- .../backend/irvm/LowerToIRVMServiceTest.java | 63 ++++++++++++------- .../p/studio/compiler/models/IRBackend.java | 10 +++ .../p/studio/compiler/models/IRGlobal.java | 32 +++++++++- .../compiler/models/IRGlobalOrigin.java | 22 +++++++ .../compiler/models/IRGlobalVisibility.java | 6 ++ .../compiler/models/IRHiddenGlobalKind.java | 6 ++ 11 files changed, 185 insertions(+), 38 deletions(-) create mode 100644 prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalOrigin.java create mode 100644 prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalVisibility.java create mode 100644 prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRHiddenGlobalKind.java diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java index ba5faa76..0065eca7 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java @@ -5,6 +5,8 @@ import p.studio.compiler.models.IRBackendExecutableFunction; import p.studio.compiler.models.IRBackendFile; import p.studio.compiler.models.IRFunction; import p.studio.compiler.models.IRGlobal; +import p.studio.compiler.models.IRGlobalOrigin; +import p.studio.compiler.models.IRGlobalVisibility; import p.studio.compiler.models.IRReservedMetadata; import p.studio.compiler.models.IRSyntheticCallableKind; import p.studio.compiler.models.IRSyntheticFunction; @@ -243,6 +245,7 @@ public final class PbsFrontendCompiler { final ModuleId moduleId, final PbsAst.File ast) { final var globals = new ArrayList(); + var nextSlot = 0; for (final var topDecl : ast.topDecls()) { if (!(topDecl instanceof PbsAst.GlobalDecl globalDecl)) { continue; @@ -252,6 +255,16 @@ public final class PbsFrontendCompiler { moduleId, globalDecl.name(), PbsReservedMetadataExtractor.typeSurfaceKey(globalDecl.explicitType()), + nextSlot++, + IRGlobalVisibility.MODULE, + false, + p.studio.compiler.models.IRHiddenGlobalKind.NONE, + new IRGlobalOrigin( + fileId, + moduleId, + globalDecl.name(), + globalDecl.span(), + globalDecl.name()), globalDecl.span())); } return ReadOnlyList.wrap(globals); diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java index 018f5619..fa920652 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java @@ -5,6 +5,10 @@ import p.studio.compiler.messages.BuildingIssueSink; import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.IRBackendExecutableFunction; +import p.studio.compiler.models.IRGlobal; +import p.studio.compiler.models.IRGlobalOrigin; +import p.studio.compiler.models.IRGlobalVisibility; +import p.studio.compiler.models.IRHiddenGlobalKind; import p.studio.compiler.models.IRSyntheticCallableKind; import p.studio.compiler.pbs.PbsFrontendCompiler; import p.studio.compiler.pbs.PbsReservedMetadataExtractor; @@ -285,22 +289,34 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { if (globals.stream().noneMatch(global -> moduleIdsMatch(entryPointModuleId, global.moduleId()) - && PbsFrontendCompiler.bootGuardGlobalName(entryPointModuleId).equals(global.name()))) { - globals.add(new p.studio.compiler.models.IRGlobal( + && global.hiddenKind() == IRHiddenGlobalKind.BOOT_GUARD)) { + globals.add(new IRGlobal( frameExecutable.fileId(), entryPointModuleId, PbsFrontendCompiler.bootGuardGlobalName(entryPointModuleId), "bool", + 0, + IRGlobalVisibility.MODULE, + true, + IRHiddenGlobalKind.BOOT_GUARD, + new IRGlobalOrigin( + frameExecutable.fileId(), + entryPointModuleId, + frameAnchorsByModule.getOrDefault(entryPointModuleId, frameExecutable.callableName()), + frameExecutable.span(), + "BOOT_GUARD"), frameExecutable.span())); } } + final var normalizedGlobals = normalizeGlobalSlots(globals); + return IRBackend.builder() .entryPointCallableName(entryPointCallableName) .entryPointModuleId(entryPointModuleId) .functions(baseBackend.getFunctions()) .syntheticFunctions(baseBackend.getSyntheticFunctions()) - .globals(ReadOnlyList.wrap(globals)) + .globals(ReadOnlyList.wrap(normalizedGlobals)) .executableFunctions(ReadOnlyList.wrap(executableFunctions)) .modulePool(baseBackend.getModulePool()) .callableSignatures(ReadOnlyList.wrap(callableSignatures)) @@ -309,6 +325,28 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { .build(); } + private ArrayList normalizeGlobalSlots(final ArrayList globals) { + final var nextSlotByModule = new LinkedHashMap(); + final var normalized = new ArrayList(globals.size()); + for (final var global : globals) { + final var moduleId = normalizeModuleId(global.moduleId()); + final var slot = nextSlotByModule.getOrDefault(moduleId, 0); + nextSlotByModule.put(moduleId, slot + 1); + normalized.add(new IRGlobal( + global.fileId(), + moduleId, + global.name(), + global.declaredTypeSurface(), + slot, + global.visibility(), + global.isHidden(), + global.hiddenKind(), + global.origin(), + global.span())); + } + return normalized; + } + private IRBackendExecutableFunction resolveExecutable( final ArrayList executableFunctions, final ModuleId moduleId, diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsFrontendCompilerTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsFrontendCompilerTest.java index 07cdb0b5..6b1b4c49 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsFrontendCompilerTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/pbs/PbsFrontendCompilerTest.java @@ -2,6 +2,7 @@ package p.studio.compiler.pbs; import org.junit.jupiter.api.Test; import p.studio.compiler.messages.HostAdmissionContext; +import p.studio.compiler.models.IRHiddenGlobalKind; import p.studio.compiler.models.IRSyntheticCallableKind; import p.studio.compiler.models.SourceKind; import p.studio.compiler.pbs.lexer.LexErrors; @@ -12,6 +13,7 @@ import p.studio.compiler.source.identifiers.FileId; import p.studio.utilities.structures.ReadOnlyList; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class PbsFrontendCompilerTest { @@ -60,6 +62,10 @@ class PbsFrontendCompilerTest { assertTrue(diagnostics.isEmpty(), diagnostics.stream().map(d -> d.getCode() + ":" + d.getMessage()).toList().toString()); assertEquals(1, fileBackend.globals().size()); assertEquals("SCORE", fileBackend.globals().getFirst().name()); + assertEquals(0, fileBackend.globals().getFirst().slot()); + assertFalse(fileBackend.globals().getFirst().isHidden()); + assertEquals(IRHiddenGlobalKind.NONE, fileBackend.globals().getFirst().hiddenKind()); + assertEquals("SCORE", fileBackend.globals().getFirst().origin().derivedFromUserSymbol()); assertEquals(4, fileBackend.syntheticFunctions().size()); assertTrue(fileBackend.syntheticFunctions().stream().anyMatch(fn -> fn.kind() == IRSyntheticCallableKind.FILE_INIT_FRAGMENT)); assertTrue(fileBackend.syntheticFunctions().stream().anyMatch(fn -> fn.kind() == IRSyntheticCallableKind.MODULE_INIT)); diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java index d3912507..1d2d6e34 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.io.TempDir; import p.studio.compiler.messages.BuildingIssueSink; import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.models.BuildStack; +import p.studio.compiler.models.IRHiddenGlobalKind; import p.studio.compiler.models.ProjectDescriptor; import p.studio.compiler.models.SourceHandle; import p.studio.compiler.models.SourceKind; @@ -362,8 +363,12 @@ class PBSFrontendPhaseServiceTest { assertTrue(diagnostics.isEmpty(), diagnostics.stream().map(d -> d.getCode() + ":" + d.getMessage()).toList().toString()); assertTrue(irBackend.getEntryPointCallableName().startsWith("__pbs.frame_wrapper$m")); - assertTrue(irBackend.getGlobals().stream().anyMatch(global -> - global.name().startsWith("__pbs.boot_guard$m"))); + final var bootGuard = irBackend.getGlobals().stream() + .filter(global -> global.hiddenKind() == IRHiddenGlobalKind.BOOT_GUARD) + .findFirst() + .orElseThrow(); + assertTrue(bootGuard.isHidden()); + assertTrue(bootGuard.name().startsWith("__pbs.boot_guard$m")); final var wrapper = irBackend.getExecutableFunctions().stream() .filter(function -> irBackend.getEntryPointCallableName().equals(function.callableName())) .findFirst() @@ -439,7 +444,7 @@ class PBSFrontendPhaseServiceTest { assertTrue(irBackend.getExecutableFunctions().stream().anyMatch(function -> function.callableName().startsWith("__pbs.project_init$m"))); assertTrue(irBackend.getGlobals().stream().anyMatch(global -> "SCORE".equals(global.name()))); - assertTrue(irBackend.getGlobals().stream().anyMatch(global -> global.name().startsWith("__pbs.boot_guard$m"))); + assertTrue(irBackend.getGlobals().stream().anyMatch(global -> global.hiddenKind() == IRHiddenGlobalKind.BOOT_GUARD)); } @Test diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/backend/irvm/LowerToIRVMService.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/backend/irvm/LowerToIRVMService.java index ed821d7b..b22394d0 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/backend/irvm/LowerToIRVMService.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/backend/irvm/LowerToIRVMService.java @@ -5,6 +5,7 @@ import p.studio.compiler.backend.bytecode.BytecodeModule; import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.IRBackendExecutableFunction; import p.studio.compiler.models.IRSyntheticCallableKind; +import p.studio.compiler.models.IRHiddenGlobalKind; import p.studio.compiler.source.Span; import p.studio.compiler.source.identifiers.CallableId; import p.studio.compiler.source.identifiers.ModuleId; @@ -501,9 +502,9 @@ public class LowerToIRVMService { "synthetic wrapper entrypoint missing: " + publishedWrapper.callableName()); } - final var expectedBootGuardName = bootGuardName(publishedWrapper.moduleId()); final var bootGuardPresent = backend.getGlobals().stream() - .anyMatch(global -> expectedBootGuardName.equals(global.name()) + .anyMatch(global -> global.hiddenKind() == IRHiddenGlobalKind.BOOT_GUARD + && global.isHidden() && sameModuleIdentity(publishedWrapper.moduleId(), global.moduleId())); if (!bootGuardPresent) { throw new IRVMLoweringException( @@ -531,11 +532,6 @@ public class LowerToIRVMService { return publishedWrapper; } - private String bootGuardName(final ModuleId moduleId) { - final var normalizedModuleId = moduleId == null ? ModuleId.none() : moduleId; - return "__pbs.boot_guard$m" + (normalizedModuleId.isNone() ? -1 : normalizedModuleId.getIndex()); - } - private boolean sameModuleIdentity( final ModuleId left, final ModuleId right) { diff --git a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/backend/irvm/LowerToIRVMServiceTest.java b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/backend/irvm/LowerToIRVMServiceTest.java index 125ae5c6..44129153 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/backend/irvm/LowerToIRVMServiceTest.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/test/java/p/studio/compiler/backend/irvm/LowerToIRVMServiceTest.java @@ -4,6 +4,9 @@ import org.junit.jupiter.api.Test; import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.IRBackendExecutableFunction; import p.studio.compiler.models.IRGlobal; +import p.studio.compiler.models.IRGlobalOrigin; +import p.studio.compiler.models.IRGlobalVisibility; +import p.studio.compiler.models.IRHiddenGlobalKind; import p.studio.compiler.models.IRSyntheticCallableKind; import p.studio.compiler.models.IRSyntheticFunction; import p.studio.compiler.models.IRSyntheticOrigin; @@ -66,12 +69,7 @@ class LowerToIRVMServiceTest { final var backend = IRBackend.builder() .entryPointCallableName("__pbs.frame_wrapper$m0") .entryPointModuleId(new ModuleId(0)) - .globals(ReadOnlyList.from(new IRGlobal( - new FileId(0), - new ModuleId(0), - "__pbs.boot_guard$m0", - "bool", - Span.none()))) + .globals(ReadOnlyList.from(hiddenBootGuard(0))) .syntheticFunctions(ReadOnlyList.from(new IRSyntheticFunction( new ModuleId(0), "__pbs.frame_wrapper$m0", @@ -115,12 +113,7 @@ class LowerToIRVMServiceTest { final var backend = IRBackend.builder() .entryPointCallableName("__pbs.frame_wrapper$m0") .entryPointModuleId(new ModuleId(0)) - .globals(ReadOnlyList.from(new IRGlobal( - new FileId(0), - new ModuleId(0), - "__pbs.boot_guard$m0", - "bool", - Span.none()))) + .globals(ReadOnlyList.from(hiddenBootGuard(0))) .syntheticFunctions(ReadOnlyList.from(new IRSyntheticFunction( new ModuleId(0), "__pbs.frame_wrapper$m0", @@ -139,12 +132,7 @@ class LowerToIRVMServiceTest { final var backend = IRBackend.builder() .entryPointCallableName("frame") .entryPointModuleId(new ModuleId(0)) - .globals(ReadOnlyList.from(new IRGlobal( - new FileId(0), - new ModuleId(0), - "__pbs.boot_guard$m0", - "bool", - Span.none()))) + .globals(ReadOnlyList.from(hiddenBootGuard(0))) .syntheticFunctions(ReadOnlyList.from(new IRSyntheticFunction( new ModuleId(0), "__pbs.frame_wrapper$m0", @@ -187,12 +175,7 @@ class LowerToIRVMServiceTest { final var backend = IRBackend.builder() .entryPointCallableName("__pbs.frame_wrapper$m0") .entryPointModuleId(new ModuleId(0)) - .globals(ReadOnlyList.from(new IRGlobal( - new FileId(0), - new ModuleId(0), - "__pbs.boot_guard$m0", - "bool", - Span.none()))) + .globals(ReadOnlyList.from(userVisibleGlobal("__pbs.boot_guard$m0", 0))) .syntheticFunctions(ReadOnlyList.from(new IRSyntheticFunction( new ModuleId(0), "__pbs.frame_wrapper$m0", @@ -419,6 +402,38 @@ class LowerToIRVMServiceTest { assertTrue(thrown.getMessage().contains("qualified entrypoint")); } + private static IRGlobal hiddenBootGuard(final int moduleId) { + final var fileId = new FileId(0); + final var ownerModuleId = new ModuleId(moduleId); + return new IRGlobal( + fileId, + ownerModuleId, + "__pbs.boot_guard$m" + moduleId, + "bool", + 0, + IRGlobalVisibility.MODULE, + true, + IRHiddenGlobalKind.BOOT_GUARD, + new IRGlobalOrigin(fileId, ownerModuleId, "frame", Span.none(), "BOOT_GUARD"), + Span.none()); + } + + private static IRGlobal userVisibleGlobal(final String name, final int moduleId) { + final var fileId = new FileId(0); + final var ownerModuleId = new ModuleId(moduleId); + return new IRGlobal( + fileId, + ownerModuleId, + name, + "bool", + 0, + IRGlobalVisibility.MODULE, + false, + IRHiddenGlobalKind.NONE, + new IRGlobalOrigin(fileId, ownerModuleId, name, Span.none(), name), + Span.none()); + } + private static IRBackendExecutableFunction fn( final String name, final String moduleKey, diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java index e08dd259..fdc469c1 100644 --- a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java @@ -73,6 +73,16 @@ public class IRBackend { remapModuleId(global.moduleId(), moduleRemap, "global"), global.name(), global.declaredTypeSurface(), + global.slot(), + global.visibility(), + global.isHidden(), + global.hiddenKind(), + new IRGlobalOrigin( + global.origin().derivedFromFile(), + remapModuleId(global.origin().derivedFromModule(), moduleRemap, "global origin"), + global.origin().derivedFromUserSymbol(), + global.origin().primarySpan(), + global.origin().fallbackSyntheticLabel()), global.span())); } final var callableRemap = reindexCallables(backendFile.callableSignatures(), moduleRemap); diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobal.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobal.java index 8071fab1..0cd55628 100644 --- a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobal.java +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobal.java @@ -11,13 +11,43 @@ public record IRGlobal( ModuleId moduleId, String name, String declaredTypeSurface, + int slot, + IRGlobalVisibility visibility, + boolean isHidden, + IRHiddenGlobalKind hiddenKind, + IRGlobalOrigin origin, Span span) { public IRGlobal { fileId = Objects.requireNonNull(fileId, "fileId"); moduleId = moduleId == null ? ModuleId.none() : moduleId; name = Objects.requireNonNull(name, "name"); declaredTypeSurface = declaredTypeSurface == null ? "" : declaredTypeSurface; + slot = Math.max(0, slot); + visibility = visibility == null ? IRGlobalVisibility.MODULE : visibility; + hiddenKind = hiddenKind == null ? IRHiddenGlobalKind.NONE : hiddenKind; + isHidden = isHidden || hiddenKind != IRHiddenGlobalKind.NONE; span = span == null ? Span.none() : span; + origin = origin == null + ? new IRGlobalOrigin(fileId, moduleId, name, span, name) + : origin; + } + + public IRGlobal( + final FileId fileId, + final ModuleId moduleId, + final String name, + final String declaredTypeSurface, + final Span span) { + this( + fileId, + moduleId, + name, + declaredTypeSurface, + 0, + IRGlobalVisibility.MODULE, + false, + IRHiddenGlobalKind.NONE, + new IRGlobalOrigin(fileId, moduleId, name, span, name), + span); } } - diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalOrigin.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalOrigin.java new file mode 100644 index 00000000..096fb540 --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalOrigin.java @@ -0,0 +1,22 @@ +package p.studio.compiler.models; + +import p.studio.compiler.source.Span; +import p.studio.compiler.source.identifiers.FileId; +import p.studio.compiler.source.identifiers.ModuleId; + +import java.util.Objects; + +public record IRGlobalOrigin( + FileId derivedFromFile, + ModuleId derivedFromModule, + String derivedFromUserSymbol, + Span primarySpan, + String fallbackSyntheticLabel) { + public IRGlobalOrigin { + derivedFromFile = Objects.requireNonNull(derivedFromFile, "derivedFromFile"); + derivedFromModule = derivedFromModule == null ? ModuleId.none() : derivedFromModule; + derivedFromUserSymbol = derivedFromUserSymbol == null ? "" : derivedFromUserSymbol; + primarySpan = primarySpan == null ? Span.none() : primarySpan; + fallbackSyntheticLabel = fallbackSyntheticLabel == null ? "" : fallbackSyntheticLabel; + } +} diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalVisibility.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalVisibility.java new file mode 100644 index 00000000..49187c41 --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRGlobalVisibility.java @@ -0,0 +1,6 @@ +package p.studio.compiler.models; + +public enum IRGlobalVisibility { + MODULE, + PUBLIC +} diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRHiddenGlobalKind.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRHiddenGlobalKind.java new file mode 100644 index 00000000..e4477b45 --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRHiddenGlobalKind.java @@ -0,0 +1,6 @@ +package p.studio.compiler.models; + +public enum IRHiddenGlobalKind { + NONE, + BOOT_GUARD +}