Skip to content

Commit 870d89d

Browse files
committed
Repo Update
- Rename libLLVM.pas to libLLVM.API.pas - Added libLLVM.pas, TLLVM class, a fluent API around LLVAM API - Added comprehensive test suite for testing libLLVM framework
1 parent 4b85759 commit 870d89d

23 files changed

+15693
-4074
lines changed

examples/testbed/Testbed.dpr

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,24 @@ uses
2121
System.SysUtils,
2222
UTestbed in 'UTestbed.pas',
2323
Dlluminator in '..\..\src\Dlluminator.pas',
24-
libLLVM in '..\..\src\libLLVM.pas';
24+
libLLVM in '..\..\src\libLLVM.pas',
25+
libLLVM.API in '..\..\src\libLLVM.API.pas',
26+
libLLVM.Utils in '..\..\src\libLLVM.Utils.pas',
27+
libLLVM.Test.Arithmetic in '..\..\src\tests\libLLVM.Test.Arithmetic.pas',
28+
libLLVM.Test.BasicBlock in '..\..\src\tests\libLLVM.Test.BasicBlock.pas',
29+
libLLVM.Test.Bitwise in '..\..\src\tests\libLLVM.Test.Bitwise.pas',
30+
libLLVM.Test.Comparison in '..\..\src\tests\libLLVM.Test.Comparison.pas',
31+
libLLVM.Test.ControlFlow in '..\..\src\tests\libLLVM.Test.ControlFlow.pas',
32+
libLLVM.Test.FunctionCall in '..\..\src\tests\libLLVM.Test.FunctionCall.pas',
33+
libLLVM.Test.Functions in '..\..\src\tests\libLLVM.Test.Functions.pas',
34+
libLLVM.Test.JIT in '..\..\src\tests\libLLVM.Test.JIT.pas',
35+
libLLVM.Test.Memory in '..\..\src\tests\libLLVM.Test.Memory.pas',
36+
libLLVM.Test.Module in '..\..\src\tests\libLLVM.Test.Module.pas',
37+
libLLVM.Test.TypeConversion in '..\..\src\tests\libLLVM.Test.TypeConversion.pas',
38+
libLLVM.Test.Types in '..\..\src\tests\libLLVM.Test.Types.pas',
39+
libLLVM.Test.Values in '..\..\src\tests\libLLVM.Test.Values.pas',
40+
libLLVM.Test.Variable in '..\..\src\tests\libLLVM.Test.Variable.pas',
41+
libLLVM.Test.CodeGen in '..\..\src\tests\libLLVM.Test.CodeGen.pas';
2542

2643
begin
2744
RunTests();

examples/testbed/Testbed.dproj

Lines changed: 17 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,6 @@
1414
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
1515
<Base>true</Base>
1616
</PropertyGroup>
17-
<PropertyGroup Condition="('$(Platform)'=='Android' and '$(Base)'=='true') or '$(Base_Android)'!=''">
18-
<Base_Android>true</Base_Android>
19-
<CfgParent>Base</CfgParent>
20-
<Base>true</Base>
21-
</PropertyGroup>
22-
<PropertyGroup Condition="('$(Platform)'=='Android64' and '$(Base)'=='true') or '$(Base_Android64)'!=''">
23-
<Base_Android64>true</Base_Android64>
24-
<CfgParent>Base</CfgParent>
25-
<Base>true</Base>
26-
</PropertyGroup>
2717
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
2818
<Base_Win32>true</Base_Win32>
2919
<CfgParent>Base</CfgParent>
@@ -73,64 +63,6 @@
7363
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
7464
<SanitizedProjectName>Testbed</SanitizedProjectName>
7565
</PropertyGroup>
76-
<PropertyGroup Condition="'$(Base_Android)'!=''">
77-
<Android_LauncherIcon36>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png</Android_LauncherIcon36>
78-
<Android_LauncherIcon48>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png</Android_LauncherIcon48>
79-
<Android_LauncherIcon72>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png</Android_LauncherIcon72>
80-
<Android_LauncherIcon96>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png</Android_LauncherIcon96>
81-
<Android_LauncherIcon144>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png</Android_LauncherIcon144>
82-
<Android_LauncherIcon192>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png</Android_LauncherIcon192>
83-
<Android_SplashImage426>$(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png</Android_SplashImage426>
84-
<Android_SplashImage470>$(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png</Android_SplashImage470>
85-
<Android_SplashImage640>$(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png</Android_SplashImage640>
86-
<Android_SplashImage960>$(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png</Android_SplashImage960>
87-
<IncludeAndroid_AdaptiveIcon>true</IncludeAndroid_AdaptiveIcon>
88-
<IncludeAndroid_VectorizedSplash>true</IncludeAndroid_VectorizedSplash>
89-
<Android_AdaptiveIconMonochrome>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Monochrome.xml</Android_AdaptiveIconMonochrome>
90-
<Android_AdaptiveIconForeground>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Foreground.xml</Android_AdaptiveIconForeground>
91-
<Android_AdaptiveIconBackground>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Background.xml</Android_AdaptiveIconBackground>
92-
<Android_VectorizedSplash>$(BDS)\bin\Artwork\Android\FM_VectorizedSplash.xml</Android_VectorizedSplash>
93-
<Android_VectorizedSplashDark>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashDark.xml</Android_VectorizedSplashDark>
94-
<Android_VectorizedSplashV31>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31.xml</Android_VectorizedSplashV31>
95-
<Android_VectorizedSplashV31Dark>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31Dark.xml</Android_VectorizedSplashV31Dark>
96-
<Android_NotificationIcon24>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png</Android_NotificationIcon24>
97-
<Android_NotificationIcon36>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png</Android_NotificationIcon36>
98-
<Android_NotificationIcon48>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png</Android_NotificationIcon48>
99-
<Android_NotificationIcon72>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png</Android_NotificationIcon72>
100-
<Android_NotificationIcon96>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png</Android_NotificationIcon96>
101-
<IncludeAndroid_NotificationAccentColor>false</IncludeAndroid_NotificationAccentColor>
102-
<IncludeAndroid_VectorizedNotificationIcon>true</IncludeAndroid_VectorizedNotificationIcon>
103-
<Android_VectorizedNotificationIcon>$(BDS)\bin\Artwork\Android\FM_VectorizedNotificationIcon.xml</Android_VectorizedNotificationIcon>
104-
</PropertyGroup>
105-
<PropertyGroup Condition="'$(Base_Android64)'!=''">
106-
<Android_LauncherIcon36>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png</Android_LauncherIcon36>
107-
<Android_LauncherIcon48>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png</Android_LauncherIcon48>
108-
<Android_LauncherIcon72>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png</Android_LauncherIcon72>
109-
<Android_LauncherIcon96>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png</Android_LauncherIcon96>
110-
<Android_LauncherIcon144>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png</Android_LauncherIcon144>
111-
<Android_LauncherIcon192>$(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png</Android_LauncherIcon192>
112-
<Android_SplashImage426>$(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png</Android_SplashImage426>
113-
<Android_SplashImage470>$(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png</Android_SplashImage470>
114-
<Android_SplashImage640>$(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png</Android_SplashImage640>
115-
<Android_SplashImage960>$(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png</Android_SplashImage960>
116-
<IncludeAndroid_AdaptiveIcon>true</IncludeAndroid_AdaptiveIcon>
117-
<IncludeAndroid_VectorizedSplash>true</IncludeAndroid_VectorizedSplash>
118-
<Android_AdaptiveIconMonochrome>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Monochrome.xml</Android_AdaptiveIconMonochrome>
119-
<Android_AdaptiveIconForeground>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Foreground.xml</Android_AdaptiveIconForeground>
120-
<Android_AdaptiveIconBackground>$(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Background.xml</Android_AdaptiveIconBackground>
121-
<Android_VectorizedSplash>$(BDS)\bin\Artwork\Android\FM_VectorizedSplash.xml</Android_VectorizedSplash>
122-
<Android_VectorizedSplashDark>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashDark.xml</Android_VectorizedSplashDark>
123-
<Android_VectorizedSplashV31>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31.xml</Android_VectorizedSplashV31>
124-
<Android_VectorizedSplashV31Dark>$(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31Dark.xml</Android_VectorizedSplashV31Dark>
125-
<Android_NotificationIcon24>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png</Android_NotificationIcon24>
126-
<Android_NotificationIcon36>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png</Android_NotificationIcon36>
127-
<Android_NotificationIcon48>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png</Android_NotificationIcon48>
128-
<Android_NotificationIcon72>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png</Android_NotificationIcon72>
129-
<Android_NotificationIcon96>$(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png</Android_NotificationIcon96>
130-
<IncludeAndroid_NotificationAccentColor>false</IncludeAndroid_NotificationAccentColor>
131-
<IncludeAndroid_VectorizedNotificationIcon>true</IncludeAndroid_VectorizedNotificationIcon>
132-
<Android_VectorizedNotificationIcon>$(BDS)\bin\Artwork\Android\FM_VectorizedNotificationIcon.xml</Android_VectorizedNotificationIcon>
133-
</PropertyGroup>
13466
<PropertyGroup Condition="'$(Base_Win32)'!=''">
13567
<DCC_UsePackage>RaizeComponentsVcl;vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;SVGIconImageListRestClient;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;JclVcl;soapmidas;SVGIconImageListFMX;vclactnband;fmxFireDAC;dbexpress;Jcl;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;Skia.Package.FMX;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;JclDeveloperTools;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;JclContainers;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RaizeComponentsVclDb;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;SVGIconImageList;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage>
13668
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
@@ -187,6 +119,23 @@
187119
<DCCReference Include="UTestbed.pas"/>
188120
<DCCReference Include="..\..\src\Dlluminator.pas"/>
189121
<DCCReference Include="..\..\src\libLLVM.pas"/>
122+
<DCCReference Include="..\..\src\libLLVM.API.pas"/>
123+
<DCCReference Include="..\..\src\libLLVM.Utils.pas"/>
124+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Arithmetic.pas"/>
125+
<DCCReference Include="..\..\src\tests\libLLVM.Test.BasicBlock.pas"/>
126+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Bitwise.pas"/>
127+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Comparison.pas"/>
128+
<DCCReference Include="..\..\src\tests\libLLVM.Test.ControlFlow.pas"/>
129+
<DCCReference Include="..\..\src\tests\libLLVM.Test.FunctionCall.pas"/>
130+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Functions.pas"/>
131+
<DCCReference Include="..\..\src\tests\libLLVM.Test.JIT.pas"/>
132+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Memory.pas"/>
133+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Module.pas"/>
134+
<DCCReference Include="..\..\src\tests\libLLVM.Test.TypeConversion.pas"/>
135+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Types.pas"/>
136+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Values.pas"/>
137+
<DCCReference Include="..\..\src\tests\libLLVM.Test.Variable.pas"/>
138+
<DCCReference Include="..\..\src\tests\libLLVM.Test.CodeGen.pas"/>
190139
<BuildConfiguration Include="Base">
191140
<Key>Base</Key>
192141
</BuildConfiguration>
@@ -1200,8 +1149,6 @@
12001149
<ProjectRoot Platform="Win64x" Name="$(PROJECTNAME)"/>
12011150
</Deployment>
12021151
<Platforms>
1203-
<Platform value="Android">False</Platform>
1204-
<Platform value="Android64">False</Platform>
12051152
<Platform value="Win32">False</Platform>
12061153
<Platform value="Win64">True</Platform>
12071154
</Platforms>

examples/testbed/UTestbed.pas

Lines changed: 44 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -20,201 +20,62 @@ procedure RunTests();
2020
implementation
2121

2222
uses
23-
WinApi.Windows,
2423
System.SysUtils,
25-
System.AnsiStrings,
26-
System.IOUtils,
27-
libLLVM;
24+
libLLVM,
25+
libLLVM.Utils,
26+
libLLVM.Test.CodeGen,
27+
libLLVM.Test.Variable,
28+
libLLVM.Test.Values,
29+
libLLVM.Test.Types,
30+
libLLVM.Test.TypeConversion,
31+
libLLVM.Test.Module,
32+
libLLVM.Test.Memory,
33+
libLLVM.Test.JIT,
34+
libLLVM.Test.Functions,
35+
libLLVM.Test.FunctionCall,
36+
libLLVM.Test.ControlFlow,
37+
libLLVM.Test.Comparison,
38+
libLLVM.Test.Bitwise,
39+
libLLVM.Test.BasicBlock,
40+
libLLVM.Test.Arithmetic;
2841

29-
procedure BuildAndLink();
42+
procedure RunTests();
3043
var
31-
// Version info
32-
LMajor: Cardinal;
33-
LMinor: Cardinal;
34-
LPatch: Cardinal;
35-
36-
// File paths
37-
LLLFile: string;
38-
LObjFile: string;
39-
LExeFile: string;
40-
41-
// LLVM objects
42-
LCtx: LLVMContextRef;
43-
LBuf: LLVMMemoryBufferRef;
44-
LMod: LLVMModuleRef;
45-
LTarget: LLVMTargetRef;
46-
LTM: LLVMTargetMachineRef;
47-
LTD: LLVMTargetDataRef;
48-
49-
// Strings and pointers
50-
LIR: string;
51-
LTripleStr: string;
52-
LCPU: string;
53-
LFeatures: string;
54-
55-
// C pointers for LLVM (need disposal)
56-
LMsg: PAnsiChar;
57-
LErr: PAnsiChar;
58-
LEmitErr: PAnsiChar;
59-
LTripleHeap: PAnsiChar;
60-
LDLStrHeap: PAnsiChar;
61-
62-
// Linking
63-
LArgs: TArray<string>;
64-
LRC: Integer;
65-
LCan: Boolean;
66-
67-
// String conversion helpers
68-
LStrLen: Cardinal;
69-
LStr: Pointer;
70-
FMarshaller: TMarshaller;
71-
72-
function AsUTF8(const AValue: string; ALength: PCardinal=nil): Pointer;
73-
begin
74-
Result := FMarshaller.AsUtf8(AValue).ToPointer;
75-
if Assigned(ALength) then
76-
ALength^ := System.AnsiStrings.StrLen(PAnsiChar(Result));
77-
end;
78-
79-
procedure FailIf(const Cond: Boolean; const Msg: string; const AArgs: array of const);
80-
begin
81-
if Cond then
82-
raise Exception.CreateFmt(Msg, AArgs);
83-
end;
84-
44+
LNum: UInt32;
8545
begin
86-
// === LLVM Version ===
87-
LMajor := 0;
88-
LMinor := 0;
89-
LPatch := 0;
90-
LLVMGetVersion(@LMajor, @LMinor, @LPatch);
91-
92-
WriteLn(Format('=== libLLVM v%s ===', [libLLVM_VERSION]));
93-
WriteLn(Format('Running LLVM v%d.%d.%d', [LMajor, LMinor, LPatch]));
94-
95-
// === File Setup ===
96-
LLLFile := '.\output\HelloWorld.ll';
97-
LObjFile := '.\output\HelloWorld.obj';
98-
LExeFile := '.\output\HelloWorld.exe';
99-
100-
// === IR Code ===
101-
LIR :=
102-
'; ModuleID = "hello"'#10 +
103-
'declare i32 @printf(ptr, ...)'#10 +
104-
'@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00"'#10 +
105-
'define i32 @main() {'#10 +
106-
' %call = call i32 (ptr, ...) @printf(ptr @.str)'#10 +
107-
' ret i32 0'#10 +
108-
'}'#10;
109-
110-
TDirectory.CreateDirectory(TPath.GetDirectoryName(LLLFile));
111-
TFile.WriteAllText(LLLFile, LIR, TEncoding.UTF8);
112-
113-
// === LLVM Initialization ===
114-
LLVMInitializeX86TargetInfo();
115-
LLVMInitializeX86Target();
116-
LLVMInitializeX86TargetMC();
117-
LLVMInitializeX86AsmPrinter();
118-
119-
// === Context and Module Creation ===
120-
LCtx := LLVMContextCreate();
121-
LMod := nil;
122-
LTM := nil;
123-
12446
try
125-
// Parse IR from memory buffer
126-
LStr := AsUTF8(LIR, @LStrLen);
127-
LBuf := LLVMCreateMemoryBufferWithMemoryRangeCopy(LStr, LStrLen, AsUTF8('hello.ll'));
128-
129-
LMsg := nil;
130-
FailIf(LLVMParseIRInContext(LCtx, LBuf, @LMod, @LMsg) <> 0,
131-
'Parse IR failed: %s', [string(LMsg)]);
132-
133-
// === Target Setup ===
134-
LTripleHeap := LLVMGetDefaultTargetTriple();
135-
try
136-
// Force Windows MSVC target for COFF compatibility
137-
LTripleStr := 'x86_64-pc-windows-msvc';
138-
LCPU := 'x86-64';
139-
LFeatures := '';
140-
141-
LErr := nil;
142-
FailIf(LLVMGetTargetFromTriple(AsUTF8(LTripleStr), @LTarget, @LErr) <> 0,
143-
'GetTarget failed: %s', [string(LErr)]);
144-
145-
LTM := LLVMCreateTargetMachine(LTarget, AsUTF8(LTripleStr), AsUTF8(LCPU),
146-
AsUTF8(LFeatures), LLVMCodeGenLevelDefault,
147-
LLVMRelocDefault, LLVMCodeModelDefault);
148-
finally
149-
if LTripleHeap <> nil then
150-
LLVMDisposeMessage(LTripleHeap);
47+
TLLUtils.PrintLn('=== libLLVM v%s ===', [TLLVM.GetVersionStr()]);
48+
TLLUtils.PrintLn('Running LLVM v%s', [TLLVM.GetLLVMVersionStr()]);
49+
TLLUtils.PrintLn();
50+
51+
LNum := 15;
52+
53+
case LNum of
54+
01: TTestArithmetic.RunAllTests();
55+
02: TTestBasicBlock.RunAllTests();
56+
03: TTestBitwise.RunAllTests();
57+
04: TTestComparison.RunAllTests();
58+
05: TTestControlFlow.RunAllTests();
59+
//06: TTestFunctionCall.RunAllTests(); // TODO: fix range check error
60+
07: TTestFunction.RunAllTests();
61+
08: TTestJIT.RunAllTests();
62+
09: TTestMemory.RunAllTests();
63+
10: TTestModule.RunAllTests();
64+
11: TTestTypeConversion.RunAllTests();
65+
12: TTestTypes.RunAllTests();
66+
13: TTestValues.RunAllTests();
67+
14: TTestVariable.RunAllTests();
68+
15: TTestCodeGen.RunAllTests();
69+
else
70+
TLLUtils.Print('Invalid test number.');
15171
end;
15272

153-
// === Module Configuration ===
154-
LLVMSetTarget(LMod, AsUTF8(LTripleStr));
155-
LTD := LLVMCreateTargetDataLayout(LTM);
156-
LDLStrHeap := LLVMCopyStringRepOfTargetData(LTD);
157-
try
158-
LLVMSetDataLayout(LMod, LDLStrHeap);
159-
finally
160-
if LDLStrHeap <> nil then
161-
LLVMDisposeMessage(LDLStrHeap);
162-
LLVMDisposeTargetData(LTD);
163-
end;
164-
165-
// === Object File Generation ===
166-
LEmitErr := nil;
167-
FailIf(LLVMTargetMachineEmitToFile(LTM, LMod, AsUTF8(LObjFile), LLVMObjectFile, @LEmitErr) <> 0,
168-
'EmitToFile failed: %s', [string(LEmitErr)]);
169-
170-
finally
171-
// Clean up in reverse order of creation
172-
if LTM <> nil then
173-
LLVMDisposeTargetMachine(LTM);
174-
if LMod <> nil then
175-
LLVMDisposeModule(LMod);
176-
if LCtx <> nil then
177-
LLVMContextDispose(LCtx);
178-
end;
179-
180-
// === Linking Phase ===
181-
LArgs := [
182-
'lld-link',
183-
'/verbose',
184-
'/nologo',
185-
'/subsystem:console',
186-
'/entry:main',
187-
'/out:' + LExeFile,
188-
LObjFile,
189-
'/libpath:.\libs',
190-
'kernel32.lib',
191-
'msvcrt.lib',
192-
'legacy_stdio_definitions.lib'
193-
];
194-
195-
LRC := LLDLink(LArgs, 'coff', LCan);
196-
197-
// === Results ===
198-
Writeln(Format('LLD rc=%d canRunAgain=%s', [LRC, BoolToStr(LCan, True)]));
199-
Writeln('LL file: ' + LLLFile);
200-
Writeln('OBJ file: ' + LObjFile);
201-
Writeln('EXE file: ' + LExeFile);
202-
end;
203-
204-
205-
procedure RunTests();
206-
begin
207-
try
208-
BuildAndLink();
20973
except
21074
on E: Exception do
21175
Writeln(E.ClassName, ': ', E.Message);
21276
end;
21377

214-
WriteLn;
215-
Write('Press ENTER to continue...');
216-
ReadLn;
217-
WriteLn;
78+
TLLUtils.Pause();
21879
end;
21980

22081
end.

0 commit comments

Comments
 (0)