- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
function f1()
{
print("Hello World!");
}
function run(f: () => void)
{
f();
}
function main() {
const x = f1;
x();
run(x);
}
// LLVM IL
; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
@frmt_11120820245497078329 = internal constant [4 x i8] c"%s\0A\00"
@s_11208736881023205110 = internal constant [14 x i8] c"Hello World!\00\00"
declare i8* @malloc(i64)
declare void @free(i8*)
declare i32 @printf(i8*, ...)
define void @f1() !dbg !3 {
%1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @frmt_11120820245497078329, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @s_11208736881023205110, i64 0, i64 0)), !dbg !7
br label %2, !dbg !9
2: ; preds = %0
ret void, !dbg !9
}
define void @run(void ()* %0) !dbg !10 {
%2 = alloca void ()*, align 8, !dbg !11
store void ()* %0, void ()** %2, align 8, !dbg !11
%3 = load void ()*, void ()** %2, align 8, !dbg !11
call void %3(), !dbg !13
br label %4, !dbg !14
4: ; preds = %1
ret void, !dbg !14
}
define void @main() !dbg !15 {
%1 = alloca void ()*, align 8, !dbg !16
%2 = alloca void ()*, align 8, !dbg !19
store void ()* @f1, void ()** %2, align 8, !dbg !19
%3 = load void ()*, void ()** %2, align 8, !dbg !19
call void %3(), !dbg !20
%4 = load void ()*, void ()** %2, align 8, !dbg !19
%5 = bitcast void ()** %1 to i8*, !dbg !16
call void @llvm.lifetime.start.p0i8(i64 8, i8* %5), !dbg !16
store void ()* %4, void ()** %1, align 8, !dbg !16
%6 = load void ()*, void ()** %1, align 8, !dbg !16
call void %6(), !dbg !21
%7 = bitcast void ()** %1 to i8*, !dbg !22
call void @llvm.lifetime.end.p0i8(i64 8, i8* %7), !dbg !22
br label %8, !dbg !23
8: ; preds = %0
ret void, !dbg !23
}
; Function Attrs: argmemonly nofree nosync nounwind willreturn
declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) #0
; Function Attrs: argmemonly nofree nosync nounwind willreturn
declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture) #0
attributes #0 = { argmemonly nofree nosync nounwind willreturn }
продолжаем говнокодить компилятор аля TypeScript в нативный код. ну это как С компилятор только без тупо-уродо-* у имен переменных
1) компилим точно также как и до этого в постах
2) получаем результат
>> Hello World!
Hello World!
ASD_77 29.04.2021 13:33 # 0
JloJle4Ka 29.04.2021 13:37 # 0
ASD_77 29.04.2021 13:42 # 0
JloJle4Ka 29.04.2021 13:50 # 0
ASD_77 29.04.2021 15:56 # 0
JloJle4Ka 29.04.2021 15:57 # 0
j123123 29.04.2021 17:32 # 0
Soul_re@ver 29.04.2021 17:35 # 0
ASD_77 29.04.2021 18:00 # 0
ASD_77 29.04.2021 18:04 # 0