package org.shedlang.compiler.backends.llvm; import org.shedlang.compiler.backends.llvm.codegen.PatioToLlvm; import org.shedlang.compiler.backends.llvm.codegen.PatioToLlvmGlobalContext; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmBasicBlock; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmReturn; import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandInt; import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableGlobal; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.patio.PatioCompilationUnit; import org.shedlang.compiler.patio.PatioExampleTests; import org.shedlang.compiler.runtime.ShedRuntime; import org.shedlang.compiler.testing.ExecutionResult; import org.shedlang.compiler.testing.TestProcessRunner; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Optional; public abstract class PatioToLlvmTests extends PatioExampleTests { @Override protected ExecutionResult executeCompilationUnit(PatioCompilationUnit patio) throws IOException, InterruptedException { var llvmModuleResult = PatioToLlvm.generateCompilationUnit( patio, PatioToLlvmGlobalContext.empty(this.target()) ); var llvmModule = llvmModuleResult.value(); llvmModule = llvmModule.addTopLevelEntity(new LlvmFunctionDefinition( "main", LlvmTypes.INT_32, List.of(), List.of( new LlvmBasicBlock( Optional.empty(), List.of( new LlvmCall( Optional.empty(), LlvmTypes.VOID, new LlvmVariableGlobal(FUNCTION_NAME), List.of() ) ), new LlvmReturn(LlvmTypes.INT_32, new LlvmOperandInt(0)) ) ) )); Files.createDirectories(Path.of("tests-tmp")); var workingDirectory = Files.createTempDirectory(Path.of("tests-tmp"), "PatioToLlvmTests"); var objectFilePath = LlvmCompiler.compileLlvmModule( llvmModule, new PartialTargetPath(workingDirectory.resolve("main")) ); var executablePath = workingDirectory.resolve("main"); var runtime = ShedRuntime.defaultRuntime(target().targetName()); LlvmBackend.forTarget(this.target()).link( List.of( objectFilePath, runtime.dir().resolve("libpatio_test.a") ), executablePath, runtime ); return TestProcessRunner.runCaptureOutput(List.of(executablePath.toString())); } protected abstract NativeTarget target(); }