- 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
- 79
function main()
{
assert(false, "defl0");
}
// получаетм MLIR tsc.exe --emit=mlir C:\temp\2.ts
module {
func @main() {
%false = constant false
typescript.assert %false, "defl0"
return
}
}
// или MLIR-LLVM
module {
llvm.mlir.global internal constant @f_7029868395233414505("C:\\temp\\2.ts\00")
llvm.mlir.global internal constant @m_964876063036005986("defl0\00")
llvm.func @_assert(!llvm.ptr<i8>, !llvm.ptr<i8>, i32)
llvm.func @main() {
%0 = llvm.mlir.constant(false) : i1
llvm.cond_br %0, ^bb1, ^bb2
^bb1: // pred: ^bb0
llvm.return
^bb2: // pred: ^bb0
%1 = llvm.mlir.addressof @m_964876063036005986 : !llvm.ptr<array<6 x i8>>
%2 = llvm.mlir.constant(0 : index) : i64
%3 = llvm.getelementptr %1[%2, %2] : (!llvm.ptr<array<6 x i8>>, i64, i64) -> !llvm.ptr<i8>
%4 = llvm.mlir.addressof @f_7029868395233414505 : !llvm.ptr<array<13 x i8>>
%5 = llvm.mlir.constant(0 : index) : i64
%6 = llvm.getelementptr %4[%5, %5] : (!llvm.ptr<array<13 x i8>>, i64, i64) -> !llvm.ptr<i8>
%7 = llvm.mlir.constant(5 : i32) : i32
llvm.call @_assert(%3, %6, %7) : (!llvm.ptr<i8>, !llvm.ptr<i8>, i32) -> ()
llvm.unreachable
}
}
// переводим в LLVM mlir-translate.exe --mlir-to-llvmir -o=out.il 1.mlir и получаем полный абзец
; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
@m_15759024501200700639 = internal constant [6 x i8] c"defl2\00"
@f_7029868395233414505 = internal constant [13 x i8] c"C:\\temp\\2.ts\00"
@m_9918845950589312633 = internal constant [6 x i8] c"defl0\00"
declare i8* @malloc(i64)
declare void @free(i8*)
declare void @_assert(i8*, i8*, i32)
define void @main() !dbg !3 {
br i1 false, label %1, label %3, !dbg !7
1: ; preds = %0
br i1 false, label %2, label %4, !dbg !9
2: ; preds = %1
ret void, !dbg !10
3: ; preds = %0
call void @_assert(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @m_9918845950589312633, i64 0, i64 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @f_7029868395233414505, i64 0, i64 0), i32 5), !dbg !11
unreachable, !dbg !12
4: ; preds = %1
call void @_assert(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @m_15759024501200700639, i64 0, i64 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @f_7029868395233414505, i64 0, i64 0), i32 12), !dbg !13
unreachable, !dbg !14
}
// компилим это говно и получаем EXE
// llc.exe --filetype=obj -o=out.o out.il
// lld.exe -flavor link out.o "libcmt.lib" "libvcruntime.lib" "kernel32.lib" "libucrt.lib" "uuid.lib"
// запускаем и вуаля
// Output:
// Assertion failed: defl0, file C:\temp\2.ts, line 5
продолжаем говнокодить. что получается из одной строчки после компиляции когда в TypeScript (компайлером)
ну все сказанно в говнокоде