1
Fork 0

initial commit: compiler and bf examples

This commit is contained in:
Joshua Moerman 2016-02-27 23:26:23 +00:00
commit 331b3ffd20
27 changed files with 16945 additions and 0 deletions

2
.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
build

23
CMakeLists.txt Normal file
View file

@ -0,0 +1,23 @@
cmake_minimum_required(VERSION 2.8)
project(LLVMCompiler)
file(GLOB sources "*.cpp")
add_executable(LLVMCompiler ${sources})
include_directories("${PROJECT_SOURCE_DIR}")
# A convenience variable:
set(LLVM_ROOT "/Users/joshua/Documents/Code/build")
# Now set the header and library paths:
include_directories( SYSTEM ${LLVM_ROOT}/include )
link_directories( ${LLVM_ROOT}/Release/lib )
add_definitions( -DNDEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -O3 -stdlib=libc++ -fvisibility-inlines-hidden -fno-exceptions -fno-rtti -fno-common -Woverloaded-virtual -Wcast-qual)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++ -nostdinc++ -I ~/Documents/Code/libcxx/include/")
# Finally, we link the LLVM libraries to our executable:
# left out gtest_main gtest
target_link_libraries(LLVMCompiler pthread m
LLVMAsmParser LLVMInstrumentation LLVMLinker LLVMArchive LLVMBitReader LLVMDebugInfo LLVMOption LLVMipo LLVMVectorize LLVMBitWriter LLVMTableGen LLVMHexagonCodeGen LLVMHexagonDesc LLVMHexagonInfo LLVMHexagonAsmPrinter LLVMNVPTXCodeGen LLVMNVPTXDesc LLVMNVPTXInfo LLVMNVPTXAsmPrinter LLVMMBlazeDisassembler LLVMMBlazeCodeGen LLVMMBlazeDesc LLVMMBlazeAsmPrinter LLVMMBlazeAsmParser LLVMMBlazeInfo LLVMCppBackendCodeGen LLVMCppBackendInfo LLVMMSP430CodeGen LLVMMSP430Desc LLVMMSP430Info LLVMMSP430AsmPrinter LLVMXCoreDisassembler LLVMXCoreCodeGen LLVMXCoreDesc LLVMXCoreInfo LLVMXCoreAsmPrinter LLVMMipsDisassembler LLVMMipsCodeGen LLVMMipsAsmParser LLVMMipsDesc LLVMMipsInfo LLVMMipsAsmPrinter LLVMARMDisassembler LLVMARMCodeGen LLVMARMAsmParser LLVMARMDesc LLVMARMInfo LLVMARMAsmPrinter LLVMPowerPCCodeGen LLVMPowerPCDesc LLVMPowerPCInfo LLVMPowerPCAsmPrinter LLVMSparcCodeGen LLVMSparcDesc LLVMSparcInfo LLVMX86Disassembler LLVMX86AsmParser LLVMX86CodeGen LLVMSelectionDAG LLVMAsmPrinter LLVMX86Desc LLVMX86Info LLVMX86AsmPrinter LLVMX86Utils LLVMMCDisassembler LLVMMCParser LLVMInterpreter LLVMMCJIT LLVMJIT LLVMCodeGen LLVMScalarOpts LLVMInstCombine LLVMTransformUtils LLVMipa LLVMAnalysis LLVMRuntimeDyld LLVMExecutionEngine LLVMTarget LLVMMC LLVMObject LLVMCore LLVMSupport)

44
bf/99bot.bf Normal file
View file

@ -0,0 +1,44 @@
>+++++++++[<+++++++++++>-]<[>[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>
[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>-]>[<<++++++++++>>>+<
-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<
[>>+>+<<<-]>>>[<<<+>>>-]>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<+++
+++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-
]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+
++++[<+++++++++>-]<.><+++++..--------.-------.>>[>>+>+<<<-]>
>>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<+++++++
+>-]<.>+++++++++[<+++++++++>-]<--.---------.>+++++++[<------
---->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++.>++++++
++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++
[<---------->-]<++.>++++++++[<++++++++++>-]<++++.-----------
-.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-.
>++[<----------->-]<.+++++++++++..>+++++++++[<---------->-]<
-----.---.>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>>+++
+[<++++++>-]<--.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.
><+++++..--------.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++
++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<++
+++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<++
+++++++++>-]<.+++..+++++++++++++.>++++++++++[<---------->-]<
-.---.>+++++++[<++++++++++>-]<++++.+++++++++++++.++++++++++.
------.>+++++++[<---------->-]<+.>++++++++[<++++++++++>-]<-.
-.---------.>+++++++[<---------->-]<+.>+++++++[<++++++++++>-
]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]
<++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>++++
+++[<---------->-]<++.>++++++++[<++++++++++>-]<.>+++[<----->
-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<
++++++++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++
.>+++++[<+++++++++++++>-]<.>+++[<++++++>-]<-.---.++++++.----
---.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>[
-]<<[>+>+<<-]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]
>[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<->-]>>+>[<[-]<
<+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<
<-[>[-]<[-]]>>+<[>[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+
<<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<++++++++>
-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..---
-----.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++
.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++>-]<-
-.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]
<.+++..+++++++++++++.>++++++++[<---------->-]<--.>+++++++++[
<+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++
++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+.
>++++++++[<+++++++++++>-]<-.>++[<----------->-]<.+++++++++++
..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]

7210
bf/99bot.bf.ll Normal file

File diff suppressed because it is too large Load diff

1
bf/ascii.bf Normal file
View file

@ -0,0 +1 @@
+[.+]

38
bf/ascii.bf.ll Normal file
View file

@ -0,0 +1,38 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = icmp ne i8 %4, 0
br i1 %5, label %6, label %14
; <label>:6 ; preds = %6, %0
%7 = load i8* %1
%8 = sext i8 %7 to i32
%9 = call i32 @putchar(i32 %8)
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = icmp ne i8 %12, 0
br i1 %13, label %6, label %14
; <label>:14 ; preds = %6, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

3
bf/hello2.bf Normal file
View file

@ -0,0 +1,3 @@
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]
<.>+++++++++++[<++++++++>-]<-.--------.+++.------.--------.[-]>++++++++[<++++>-
]<+.[-]++++++++++.

539
bf/hello2.bf.ll Normal file
View file

@ -0,0 +1,539 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = getelementptr i8* %1, i32 1
%3 = load i8* %2
%4 = add i8 %3, 1
store i8 %4, i8* %2
%5 = load i8* %2
%6 = add i8 %5, 1
store i8 %6, i8* %2
%7 = load i8* %2
%8 = add i8 %7, 1
store i8 %8, i8* %2
%9 = load i8* %2
%10 = add i8 %9, 1
store i8 %10, i8* %2
%11 = load i8* %2
%12 = add i8 %11, 1
store i8 %12, i8* %2
%13 = load i8* %2
%14 = add i8 %13, 1
store i8 %14, i8* %2
%15 = load i8* %2
%16 = add i8 %15, 1
store i8 %16, i8* %2
%17 = load i8* %2
%18 = add i8 %17, 1
store i8 %18, i8* %2
%19 = load i8* %2
%20 = add i8 %19, 1
store i8 %20, i8* %2
%21 = load i8* %2
%22 = icmp ne i8 %21, 0
br i1 %22, label %23, label %46
; <label>:23 ; preds = %23, %0
%24 = getelementptr i8* %2, i32 -1
%25 = load i8* %24
%26 = add i8 %25, 1
store i8 %26, i8* %24
%27 = load i8* %24
%28 = add i8 %27, 1
store i8 %28, i8* %24
%29 = load i8* %24
%30 = add i8 %29, 1
store i8 %30, i8* %24
%31 = load i8* %24
%32 = add i8 %31, 1
store i8 %32, i8* %24
%33 = load i8* %24
%34 = add i8 %33, 1
store i8 %34, i8* %24
%35 = load i8* %24
%36 = add i8 %35, 1
store i8 %36, i8* %24
%37 = load i8* %24
%38 = add i8 %37, 1
store i8 %38, i8* %24
%39 = load i8* %24
%40 = add i8 %39, 1
store i8 %40, i8* %24
%41 = getelementptr i8* %24, i32 1
%42 = load i8* %41
%43 = sub i8 %42, 1
store i8 %43, i8* %41
%44 = load i8* %41
%45 = icmp ne i8 %44, 0
br i1 %45, label %23, label %46
; <label>:46 ; preds = %23, %0
%47 = getelementptr i8* %41, i32 -1
%48 = load i8* %47
%49 = sext i8 %48 to i32
%50 = call i32 @putchar(i32 %49)
%51 = getelementptr i8* %47, i32 1
%52 = load i8* %51
%53 = add i8 %52, 1
store i8 %53, i8* %51
%54 = load i8* %51
%55 = add i8 %54, 1
store i8 %55, i8* %51
%56 = load i8* %51
%57 = add i8 %56, 1
store i8 %57, i8* %51
%58 = load i8* %51
%59 = add i8 %58, 1
store i8 %59, i8* %51
%60 = load i8* %51
%61 = add i8 %60, 1
store i8 %61, i8* %51
%62 = load i8* %51
%63 = add i8 %62, 1
store i8 %63, i8* %51
%64 = load i8* %51
%65 = add i8 %64, 1
store i8 %65, i8* %51
%66 = load i8* %51
%67 = icmp ne i8 %66, 0
br i1 %67, label %68, label %83
; <label>:68 ; preds = %68, %46
%69 = getelementptr i8* %51, i32 -1
%70 = load i8* %69
%71 = add i8 %70, 1
store i8 %71, i8* %69
%72 = load i8* %69
%73 = add i8 %72, 1
store i8 %73, i8* %69
%74 = load i8* %69
%75 = add i8 %74, 1
store i8 %75, i8* %69
%76 = load i8* %69
%77 = add i8 %76, 1
store i8 %77, i8* %69
%78 = getelementptr i8* %69, i32 1
%79 = load i8* %78
%80 = sub i8 %79, 1
store i8 %80, i8* %78
%81 = load i8* %78
%82 = icmp ne i8 %81, 0
br i1 %82, label %68, label %83
; <label>:83 ; preds = %68, %46
%84 = getelementptr i8* %78, i32 -1
%85 = load i8* %84
%86 = add i8 %85, 1
store i8 %86, i8* %84
%87 = load i8* %84
%88 = sext i8 %87 to i32
%89 = call i32 @putchar(i32 %88)
%90 = load i8* %84
%91 = add i8 %90, 1
store i8 %91, i8* %84
%92 = load i8* %84
%93 = add i8 %92, 1
store i8 %93, i8* %84
%94 = load i8* %84
%95 = add i8 %94, 1
store i8 %95, i8* %84
%96 = load i8* %84
%97 = add i8 %96, 1
store i8 %97, i8* %84
%98 = load i8* %84
%99 = add i8 %98, 1
store i8 %99, i8* %84
%100 = load i8* %84
%101 = add i8 %100, 1
store i8 %101, i8* %84
%102 = load i8* %84
%103 = add i8 %102, 1
store i8 %103, i8* %84
%104 = load i8* %84
%105 = sext i8 %104 to i32
%106 = call i32 @putchar(i32 %105)
%107 = load i8* %84
%108 = sext i8 %107 to i32
%109 = call i32 @putchar(i32 %108)
%110 = load i8* %84
%111 = add i8 %110, 1
store i8 %111, i8* %84
%112 = load i8* %84
%113 = add i8 %112, 1
store i8 %113, i8* %84
%114 = load i8* %84
%115 = add i8 %114, 1
store i8 %115, i8* %84
%116 = load i8* %84
%117 = sext i8 %116 to i32
%118 = call i32 @putchar(i32 %117)
%119 = load i8* %84
%120 = icmp ne i8 %119, 0
br i1 %120, label %121, label %126
; <label>:121 ; preds = %121, %83
%122 = load i8* %84
%123 = sub i8 %122, 1
store i8 %123, i8* %84
%124 = load i8* %84
%125 = icmp ne i8 %124, 0
br i1 %125, label %121, label %126
; <label>:126 ; preds = %121, %83
%127 = getelementptr i8* %84, i32 1
%128 = load i8* %127
%129 = add i8 %128, 1
store i8 %129, i8* %127
%130 = load i8* %127
%131 = add i8 %130, 1
store i8 %131, i8* %127
%132 = load i8* %127
%133 = add i8 %132, 1
store i8 %133, i8* %127
%134 = load i8* %127
%135 = add i8 %134, 1
store i8 %135, i8* %127
%136 = load i8* %127
%137 = add i8 %136, 1
store i8 %137, i8* %127
%138 = load i8* %127
%139 = add i8 %138, 1
store i8 %139, i8* %127
%140 = load i8* %127
%141 = add i8 %140, 1
store i8 %141, i8* %127
%142 = load i8* %127
%143 = add i8 %142, 1
store i8 %143, i8* %127
%144 = load i8* %127
%145 = icmp ne i8 %144, 0
br i1 %145, label %146, label %161
; <label>:146 ; preds = %146, %126
%147 = getelementptr i8* %127, i32 -1
%148 = load i8* %147
%149 = add i8 %148, 1
store i8 %149, i8* %147
%150 = load i8* %147
%151 = add i8 %150, 1
store i8 %151, i8* %147
%152 = load i8* %147
%153 = add i8 %152, 1
store i8 %153, i8* %147
%154 = load i8* %147
%155 = add i8 %154, 1
store i8 %155, i8* %147
%156 = getelementptr i8* %147, i32 1
%157 = load i8* %156
%158 = sub i8 %157, 1
store i8 %158, i8* %156
%159 = load i8* %156
%160 = icmp ne i8 %159, 0
br i1 %160, label %146, label %161
; <label>:161 ; preds = %146, %126
%162 = getelementptr i8* %156, i32 -1
%163 = load i8* %162
%164 = sext i8 %163 to i32
%165 = call i32 @putchar(i32 %164)
%166 = getelementptr i8* %162, i32 1
%167 = load i8* %166
%168 = add i8 %167, 1
store i8 %168, i8* %166
%169 = load i8* %166
%170 = add i8 %169, 1
store i8 %170, i8* %166
%171 = load i8* %166
%172 = add i8 %171, 1
store i8 %172, i8* %166
%173 = load i8* %166
%174 = add i8 %173, 1
store i8 %174, i8* %166
%175 = load i8* %166
%176 = add i8 %175, 1
store i8 %176, i8* %166
%177 = load i8* %166
%178 = add i8 %177, 1
store i8 %178, i8* %166
%179 = load i8* %166
%180 = add i8 %179, 1
store i8 %180, i8* %166
%181 = load i8* %166
%182 = add i8 %181, 1
store i8 %182, i8* %166
%183 = load i8* %166
%184 = add i8 %183, 1
store i8 %184, i8* %166
%185 = load i8* %166
%186 = add i8 %185, 1
store i8 %186, i8* %166
%187 = load i8* %166
%188 = add i8 %187, 1
store i8 %188, i8* %166
%189 = load i8* %166
%190 = icmp ne i8 %189, 0
br i1 %190, label %191, label %214
; <label>:191 ; preds = %191, %161
%192 = getelementptr i8* %166, i32 -1
%193 = load i8* %192
%194 = add i8 %193, 1
store i8 %194, i8* %192
%195 = load i8* %192
%196 = add i8 %195, 1
store i8 %196, i8* %192
%197 = load i8* %192
%198 = add i8 %197, 1
store i8 %198, i8* %192
%199 = load i8* %192
%200 = add i8 %199, 1
store i8 %200, i8* %192
%201 = load i8* %192
%202 = add i8 %201, 1
store i8 %202, i8* %192
%203 = load i8* %192
%204 = add i8 %203, 1
store i8 %204, i8* %192
%205 = load i8* %192
%206 = add i8 %205, 1
store i8 %206, i8* %192
%207 = load i8* %192
%208 = add i8 %207, 1
store i8 %208, i8* %192
%209 = getelementptr i8* %192, i32 1
%210 = load i8* %209
%211 = sub i8 %210, 1
store i8 %211, i8* %209
%212 = load i8* %209
%213 = icmp ne i8 %212, 0
br i1 %213, label %191, label %214
; <label>:214 ; preds = %191, %161
%215 = getelementptr i8* %209, i32 -1
%216 = load i8* %215
%217 = sub i8 %216, 1
store i8 %217, i8* %215
%218 = load i8* %215
%219 = sext i8 %218 to i32
%220 = call i32 @putchar(i32 %219)
%221 = load i8* %215
%222 = sub i8 %221, 1
store i8 %222, i8* %215
%223 = load i8* %215
%224 = sub i8 %223, 1
store i8 %224, i8* %215
%225 = load i8* %215
%226 = sub i8 %225, 1
store i8 %226, i8* %215
%227 = load i8* %215
%228 = sub i8 %227, 1
store i8 %228, i8* %215
%229 = load i8* %215
%230 = sub i8 %229, 1
store i8 %230, i8* %215
%231 = load i8* %215
%232 = sub i8 %231, 1
store i8 %232, i8* %215
%233 = load i8* %215
%234 = sub i8 %233, 1
store i8 %234, i8* %215
%235 = load i8* %215
%236 = sub i8 %235, 1
store i8 %236, i8* %215
%237 = load i8* %215
%238 = sext i8 %237 to i32
%239 = call i32 @putchar(i32 %238)
%240 = load i8* %215
%241 = add i8 %240, 1
store i8 %241, i8* %215
%242 = load i8* %215
%243 = add i8 %242, 1
store i8 %243, i8* %215
%244 = load i8* %215
%245 = add i8 %244, 1
store i8 %245, i8* %215
%246 = load i8* %215
%247 = sext i8 %246 to i32
%248 = call i32 @putchar(i32 %247)
%249 = load i8* %215
%250 = sub i8 %249, 1
store i8 %250, i8* %215
%251 = load i8* %215
%252 = sub i8 %251, 1
store i8 %252, i8* %215
%253 = load i8* %215
%254 = sub i8 %253, 1
store i8 %254, i8* %215
%255 = load i8* %215
%256 = sub i8 %255, 1
store i8 %256, i8* %215
%257 = load i8* %215
%258 = sub i8 %257, 1
store i8 %258, i8* %215
%259 = load i8* %215
%260 = sub i8 %259, 1
store i8 %260, i8* %215
%261 = load i8* %215
%262 = sext i8 %261 to i32
%263 = call i32 @putchar(i32 %262)
%264 = load i8* %215
%265 = sub i8 %264, 1
store i8 %265, i8* %215
%266 = load i8* %215
%267 = sub i8 %266, 1
store i8 %267, i8* %215
%268 = load i8* %215
%269 = sub i8 %268, 1
store i8 %269, i8* %215
%270 = load i8* %215
%271 = sub i8 %270, 1
store i8 %271, i8* %215
%272 = load i8* %215
%273 = sub i8 %272, 1
store i8 %273, i8* %215
%274 = load i8* %215
%275 = sub i8 %274, 1
store i8 %275, i8* %215
%276 = load i8* %215
%277 = sub i8 %276, 1
store i8 %277, i8* %215
%278 = load i8* %215
%279 = sub i8 %278, 1
store i8 %279, i8* %215
%280 = load i8* %215
%281 = sext i8 %280 to i32
%282 = call i32 @putchar(i32 %281)
%283 = load i8* %215
%284 = icmp ne i8 %283, 0
br i1 %284, label %285, label %290
; <label>:285 ; preds = %285, %214
%286 = load i8* %215
%287 = sub i8 %286, 1
store i8 %287, i8* %215
%288 = load i8* %215
%289 = icmp ne i8 %288, 0
br i1 %289, label %285, label %290
; <label>:290 ; preds = %285, %214
%291 = getelementptr i8* %215, i32 1
%292 = load i8* %291
%293 = add i8 %292, 1
store i8 %293, i8* %291
%294 = load i8* %291
%295 = add i8 %294, 1
store i8 %295, i8* %291
%296 = load i8* %291
%297 = add i8 %296, 1
store i8 %297, i8* %291
%298 = load i8* %291
%299 = add i8 %298, 1
store i8 %299, i8* %291
%300 = load i8* %291
%301 = add i8 %300, 1
store i8 %301, i8* %291
%302 = load i8* %291
%303 = add i8 %302, 1
store i8 %303, i8* %291
%304 = load i8* %291
%305 = add i8 %304, 1
store i8 %305, i8* %291
%306 = load i8* %291
%307 = add i8 %306, 1
store i8 %307, i8* %291
%308 = load i8* %291
%309 = icmp ne i8 %308, 0
br i1 %309, label %310, label %325
; <label>:310 ; preds = %310, %290
%311 = getelementptr i8* %291, i32 -1
%312 = load i8* %311
%313 = add i8 %312, 1
store i8 %313, i8* %311
%314 = load i8* %311
%315 = add i8 %314, 1
store i8 %315, i8* %311
%316 = load i8* %311
%317 = add i8 %316, 1
store i8 %317, i8* %311
%318 = load i8* %311
%319 = add i8 %318, 1
store i8 %319, i8* %311
%320 = getelementptr i8* %311, i32 1
%321 = load i8* %320
%322 = sub i8 %321, 1
store i8 %322, i8* %320
%323 = load i8* %320
%324 = icmp ne i8 %323, 0
br i1 %324, label %310, label %325
; <label>:325 ; preds = %310, %290
%326 = getelementptr i8* %320, i32 -1
%327 = load i8* %326
%328 = add i8 %327, 1
store i8 %328, i8* %326
%329 = load i8* %326
%330 = sext i8 %329 to i32
%331 = call i32 @putchar(i32 %330)
%332 = load i8* %326
%333 = icmp ne i8 %332, 0
br i1 %333, label %334, label %339
; <label>:334 ; preds = %334, %325
%335 = load i8* %326
%336 = sub i8 %335, 1
store i8 %336, i8* %326
%337 = load i8* %326
%338 = icmp ne i8 %337, 0
br i1 %338, label %334, label %339
; <label>:339 ; preds = %334, %325
%340 = load i8* %326
%341 = add i8 %340, 1
store i8 %341, i8* %326
%342 = load i8* %326
%343 = add i8 %342, 1
store i8 %343, i8* %326
%344 = load i8* %326
%345 = add i8 %344, 1
store i8 %345, i8* %326
%346 = load i8* %326
%347 = add i8 %346, 1
store i8 %347, i8* %326
%348 = load i8* %326
%349 = add i8 %348, 1
store i8 %349, i8* %326
%350 = load i8* %326
%351 = add i8 %350, 1
store i8 %351, i8* %326
%352 = load i8* %326
%353 = add i8 %352, 1
store i8 %353, i8* %326
%354 = load i8* %326
%355 = add i8 %354, 1
store i8 %355, i8* %326
%356 = load i8* %326
%357 = add i8 %356, 1
store i8 %357, i8* %326
%358 = load i8* %326
%359 = add i8 %358, 1
store i8 %359, i8* %326
%360 = load i8* %326
%361 = sext i8 %360 to i32
%362 = call i32 @putchar(i32 %361)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

1
bf/helloworld.bf Normal file
View file

@ -0,0 +1 @@
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

324
bf/helloworld.bf.ll Normal file
View file

@ -0,0 +1,324 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = icmp ne i8 %22, 0
br i1 %23, label %24, label %79
; <label>:24 ; preds = %24, %0
%25 = getelementptr i8* %1, i32 1
%26 = load i8* %25
%27 = add i8 %26, 1
store i8 %27, i8* %25
%28 = load i8* %25
%29 = add i8 %28, 1
store i8 %29, i8* %25
%30 = load i8* %25
%31 = add i8 %30, 1
store i8 %31, i8* %25
%32 = load i8* %25
%33 = add i8 %32, 1
store i8 %33, i8* %25
%34 = load i8* %25
%35 = add i8 %34, 1
store i8 %35, i8* %25
%36 = load i8* %25
%37 = add i8 %36, 1
store i8 %37, i8* %25
%38 = load i8* %25
%39 = add i8 %38, 1
store i8 %39, i8* %25
%40 = getelementptr i8* %25, i32 1
%41 = load i8* %40
%42 = add i8 %41, 1
store i8 %42, i8* %40
%43 = load i8* %40
%44 = add i8 %43, 1
store i8 %44, i8* %40
%45 = load i8* %40
%46 = add i8 %45, 1
store i8 %46, i8* %40
%47 = load i8* %40
%48 = add i8 %47, 1
store i8 %48, i8* %40
%49 = load i8* %40
%50 = add i8 %49, 1
store i8 %50, i8* %40
%51 = load i8* %40
%52 = add i8 %51, 1
store i8 %52, i8* %40
%53 = load i8* %40
%54 = add i8 %53, 1
store i8 %54, i8* %40
%55 = load i8* %40
%56 = add i8 %55, 1
store i8 %56, i8* %40
%57 = load i8* %40
%58 = add i8 %57, 1
store i8 %58, i8* %40
%59 = load i8* %40
%60 = add i8 %59, 1
store i8 %60, i8* %40
%61 = getelementptr i8* %40, i32 1
%62 = load i8* %61
%63 = add i8 %62, 1
store i8 %63, i8* %61
%64 = load i8* %61
%65 = add i8 %64, 1
store i8 %65, i8* %61
%66 = load i8* %61
%67 = add i8 %66, 1
store i8 %67, i8* %61
%68 = getelementptr i8* %61, i32 1
%69 = load i8* %68
%70 = add i8 %69, 1
store i8 %70, i8* %68
%71 = getelementptr i8* %68, i32 -1
%72 = getelementptr i8* %71, i32 -1
%73 = getelementptr i8* %72, i32 -1
%74 = getelementptr i8* %73, i32 -1
%75 = load i8* %74
%76 = sub i8 %75, 1
store i8 %76, i8* %74
%77 = load i8* %74
%78 = icmp ne i8 %77, 0
br i1 %78, label %24, label %79
; <label>:79 ; preds = %24, %0
%80 = getelementptr i8* %74, i32 1
%81 = load i8* %80
%82 = add i8 %81, 1
store i8 %82, i8* %80
%83 = load i8* %80
%84 = add i8 %83, 1
store i8 %84, i8* %80
%85 = load i8* %80
%86 = sext i8 %85 to i32
%87 = call i32 @putchar(i32 %86)
%88 = getelementptr i8* %80, i32 1
%89 = load i8* %88
%90 = add i8 %89, 1
store i8 %90, i8* %88
%91 = load i8* %88
%92 = sext i8 %91 to i32
%93 = call i32 @putchar(i32 %92)
%94 = load i8* %88
%95 = add i8 %94, 1
store i8 %95, i8* %88
%96 = load i8* %88
%97 = add i8 %96, 1
store i8 %97, i8* %88
%98 = load i8* %88
%99 = add i8 %98, 1
store i8 %99, i8* %88
%100 = load i8* %88
%101 = add i8 %100, 1
store i8 %101, i8* %88
%102 = load i8* %88
%103 = add i8 %102, 1
store i8 %103, i8* %88
%104 = load i8* %88
%105 = add i8 %104, 1
store i8 %105, i8* %88
%106 = load i8* %88
%107 = add i8 %106, 1
store i8 %107, i8* %88
%108 = load i8* %88
%109 = sext i8 %108 to i32
%110 = call i32 @putchar(i32 %109)
%111 = load i8* %88
%112 = sext i8 %111 to i32
%113 = call i32 @putchar(i32 %112)
%114 = load i8* %88
%115 = add i8 %114, 1
store i8 %115, i8* %88
%116 = load i8* %88
%117 = add i8 %116, 1
store i8 %117, i8* %88
%118 = load i8* %88
%119 = add i8 %118, 1
store i8 %119, i8* %88
%120 = load i8* %88
%121 = sext i8 %120 to i32
%122 = call i32 @putchar(i32 %121)
%123 = getelementptr i8* %88, i32 1
%124 = load i8* %123
%125 = add i8 %124, 1
store i8 %125, i8* %123
%126 = load i8* %123
%127 = add i8 %126, 1
store i8 %127, i8* %123
%128 = load i8* %123
%129 = sext i8 %128 to i32
%130 = call i32 @putchar(i32 %129)
%131 = getelementptr i8* %123, i32 -1
%132 = getelementptr i8* %131, i32 -1
%133 = load i8* %132
%134 = add i8 %133, 1
store i8 %134, i8* %132
%135 = load i8* %132
%136 = add i8 %135, 1
store i8 %136, i8* %132
%137 = load i8* %132
%138 = add i8 %137, 1
store i8 %138, i8* %132
%139 = load i8* %132
%140 = add i8 %139, 1
store i8 %140, i8* %132
%141 = load i8* %132
%142 = add i8 %141, 1
store i8 %142, i8* %132
%143 = load i8* %132
%144 = add i8 %143, 1
store i8 %144, i8* %132
%145 = load i8* %132
%146 = add i8 %145, 1
store i8 %146, i8* %132
%147 = load i8* %132
%148 = add i8 %147, 1
store i8 %148, i8* %132
%149 = load i8* %132
%150 = add i8 %149, 1
store i8 %150, i8* %132
%151 = load i8* %132
%152 = add i8 %151, 1
store i8 %152, i8* %132
%153 = load i8* %132
%154 = add i8 %153, 1
store i8 %154, i8* %132
%155 = load i8* %132
%156 = add i8 %155, 1
store i8 %156, i8* %132
%157 = load i8* %132
%158 = add i8 %157, 1
store i8 %158, i8* %132
%159 = load i8* %132
%160 = add i8 %159, 1
store i8 %160, i8* %132
%161 = load i8* %132
%162 = add i8 %161, 1
store i8 %162, i8* %132
%163 = load i8* %132
%164 = sext i8 %163 to i32
%165 = call i32 @putchar(i32 %164)
%166 = getelementptr i8* %132, i32 1
%167 = load i8* %166
%168 = sext i8 %167 to i32
%169 = call i32 @putchar(i32 %168)
%170 = load i8* %166
%171 = add i8 %170, 1
store i8 %171, i8* %166
%172 = load i8* %166
%173 = add i8 %172, 1
store i8 %173, i8* %166
%174 = load i8* %166
%175 = add i8 %174, 1
store i8 %175, i8* %166
%176 = load i8* %166
%177 = sext i8 %176 to i32
%178 = call i32 @putchar(i32 %177)
%179 = load i8* %166
%180 = sub i8 %179, 1
store i8 %180, i8* %166
%181 = load i8* %166
%182 = sub i8 %181, 1
store i8 %182, i8* %166
%183 = load i8* %166
%184 = sub i8 %183, 1
store i8 %184, i8* %166
%185 = load i8* %166
%186 = sub i8 %185, 1
store i8 %186, i8* %166
%187 = load i8* %166
%188 = sub i8 %187, 1
store i8 %188, i8* %166
%189 = load i8* %166
%190 = sub i8 %189, 1
store i8 %190, i8* %166
%191 = load i8* %166
%192 = sext i8 %191 to i32
%193 = call i32 @putchar(i32 %192)
%194 = load i8* %166
%195 = sub i8 %194, 1
store i8 %195, i8* %166
%196 = load i8* %166
%197 = sub i8 %196, 1
store i8 %197, i8* %166
%198 = load i8* %166
%199 = sub i8 %198, 1
store i8 %199, i8* %166
%200 = load i8* %166
%201 = sub i8 %200, 1
store i8 %201, i8* %166
%202 = load i8* %166
%203 = sub i8 %202, 1
store i8 %203, i8* %166
%204 = load i8* %166
%205 = sub i8 %204, 1
store i8 %205, i8* %166
%206 = load i8* %166
%207 = sub i8 %206, 1
store i8 %207, i8* %166
%208 = load i8* %166
%209 = sub i8 %208, 1
store i8 %209, i8* %166
%210 = load i8* %166
%211 = sext i8 %210 to i32
%212 = call i32 @putchar(i32 %211)
%213 = getelementptr i8* %166, i32 1
%214 = load i8* %213
%215 = add i8 %214, 1
store i8 %215, i8* %213
%216 = load i8* %213
%217 = sext i8 %216 to i32
%218 = call i32 @putchar(i32 %217)
%219 = getelementptr i8* %213, i32 1
%220 = load i8* %219
%221 = sext i8 %220 to i32
%222 = call i32 @putchar(i32 %221)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

221
bf/primes.bf Normal file
View file

@ -0,0 +1,221 @@
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
===================================================================
======================== INPUT NUMBER ============================
===================================================================
+ cont=1
[
- cont=0
>,
======SUB10======
----------
[ not 10
<+> cont=1
=====SUB38======
----------
----------
----------
--------
>
=====MUL10=======
[>+>+<<-]>>[<<+>>-]< dup
>>>+++++++++
[
<<<
[>+>+<<-]>>[<<+>>-]< dup
[<<+>>-]
>>-
]
<<<[-]<
======RMOVE1======
<
[>+<-]
]
<
]
>>[<<+>>-]<<
===================================================================
======================= PROCESS NUMBER ===========================
===================================================================
==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====
>+<-
[
>+
======DUP======
[>+>+<<-]>>[<<+>>-]<
>+<--
>>>>>>>>+<<<<<<<< isprime=1
[
>+
<-
=====DUP3=====
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
=====DUP2=====
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
>>>
====DIVIDES=======
[>+>+<<-]>>[<<+>>-]< DUP i=div
<<
[
>>>>>+ bool=1
<<<
[>+>+<<-]>>[<<+>>-]< DUP
[>>[-]<<-] IF i THEN bool=0
>>
[ IF i=0
<<<<
[>+>+<<-]>>[<<+>>-]< i=div
>>>
- bool=0
]
<<<
- DEC i
<<
-
]
+>>[<<[-]>>-]<<
>[-]< CLR div
=====END DIVIDES====
[>>>>>>[-]<<<<<<-] if divides then isprime=0
<<
>>[-]>[-]<<<
]
>>>>>>>>
[
-
<<<<<<<[-]<<
[>>+>+<<<-]>>>[<<<+>>>-]<<<
>>
===================================================================
======================== OUTPUT NUMBER ===========================
===================================================================
[>+<-]>
[
======DUP======
[>+>+<<-]>>[<<+>>-]<
======MOD10====
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>-] if ten=0 ten=10
<<- dec ten
<- dec num
]
+++++++++ num=9
>[<->-]< dec num by ten
=======RROT======
[>+<-]
< [>+<-]
< [>+<-]
>>>[<<<+>>>-]
<
=======DIV10========
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
<<- dec ten
<- dec num
]
>>>>[<<<<+>>>>-]<<<< copy div to num
>[-]< clear ten
=======INC1=========
<+>
]
<
[
=======MOVER=========
[>+<-]
=======ADD48========
+++++++[<+++++++>-]<->
=======PUTC=======
<.[-]>
======MOVEL2========
>[<<+>>-]<
<-
]
>++++[<++++++++>-]<.[-]
===================================================================
=========================== END FOR ===============================
===================================================================
>>>>>>>
]
<<<<<<<<
>[-]<
[-]
<<-
]
======LF========
++++++++++.[-]

3590
bf/primes.bf.ll Normal file

File diff suppressed because it is too large Load diff

11
bf/quine.bf Normal file
View file

@ -0,0 +1,11 @@
->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+>+++>>++>++>>+>>+>++>++>+
>>>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>++>+>>>>+++>>+++++>>+>+++>>>
++>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+++>+>+++>>>++>>++++>>+>>++>+
>>>>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>>+++>+>>>>+++>>++>++>+>+++>+>++
>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>>>>++>>>+>>>++>+>>>>+++>+>>>+>>++>
+>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++>>++++++
>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>>++>+>+++>>>++>>++++++++>>+>>++>+>>>>+++
>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>+>+>++>+>>>>+++>>+++>>>+[[->>+<<]<+]+++++
[->+++++++++<]>.[+]>>[<<+++++++[->+++++++++<]>-.------------------->-[-<.<+>>]<
[+]<+>>>]<<<[-[-[-[>>+<++++++[->+++++<]]>++++++++++++++<]>+++<]++++++
[->+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]

1853
bf/quine.bf.ll Normal file

File diff suppressed because it is too large Load diff

18
bf/rot13.bf Normal file
View file

@ -0,0 +1,18 @@
,
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>>+++++[<----->-]<<-
[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-
[>++++++++++++++<-
[>+<-]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]>.[-]<,]

2519
bf/rot13.bf.ll Normal file

File diff suppressed because it is too large Load diff

1
bf/test.bf Normal file
View file

@ -0,0 +1 @@
++++++++++++++++++++++++[><.-]

109
bf/test.bf.ll Normal file
View file

@ -0,0 +1,109 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = add i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = add i8 %24, 1
store i8 %25, i8* %1
%26 = load i8* %1
%27 = add i8 %26, 1
store i8 %27, i8* %1
%28 = load i8* %1
%29 = add i8 %28, 1
store i8 %29, i8* %1
%30 = load i8* %1
%31 = add i8 %30, 1
store i8 %31, i8* %1
%32 = load i8* %1
%33 = add i8 %32, 1
store i8 %33, i8* %1
%34 = load i8* %1
%35 = add i8 %34, 1
store i8 %35, i8* %1
%36 = load i8* %1
%37 = add i8 %36, 1
store i8 %37, i8* %1
%38 = load i8* %1
%39 = add i8 %38, 1
store i8 %39, i8* %1
%40 = load i8* %1
%41 = add i8 %40, 1
store i8 %41, i8* %1
%42 = load i8* %1
%43 = add i8 %42, 1
store i8 %43, i8* %1
%44 = load i8* %1
%45 = add i8 %44, 1
store i8 %45, i8* %1
%46 = load i8* %1
%47 = add i8 %46, 1
store i8 %47, i8* %1
%48 = load i8* %1
%49 = add i8 %48, 1
store i8 %49, i8* %1
%50 = load i8* %1
%51 = icmp ne i8 %50, 0
br i1 %51, label %52, label %62
; <label>:52 ; preds = %52, %0
%53 = getelementptr i8* %1, i32 1
%54 = getelementptr i8* %53, i32 -1
%55 = load i8* %54
%56 = sext i8 %55 to i32
%57 = call i32 @putchar(i32 %56)
%58 = load i8* %54
%59 = sub i8 %58, 1
store i8 %59, i8* %54
%60 = load i8* %54
%61 = icmp ne i8 %60, 0
br i1 %61, label %52, label %62
; <label>:62 ; preds = %52, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

0
bf/test2.bf Normal file
View file

19
bf/test2.bf.ll Normal file
View file

@ -0,0 +1,19 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

1
bf/upper.bf Normal file
View file

@ -0,0 +1 @@
,----------[----------------------.,----------]++++++++++.

197
bf/upper.bf.ll Normal file
View file

@ -0,0 +1,197 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = call i32 @getchar()
%3 = trunc i32 %2 to i8
store i8 %3, i8* %1
%4 = load i8* %1
%5 = sub i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = sub i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = sub i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = sub i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = sub i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = sub i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = sub i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = sub i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = sub i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = sub i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = icmp ne i8 %24, 0
br i1 %25, label %26, label %98
; <label>:26 ; preds = %26, %0
%27 = load i8* %1
%28 = sub i8 %27, 1
store i8 %28, i8* %1
%29 = load i8* %1
%30 = sub i8 %29, 1
store i8 %30, i8* %1
%31 = load i8* %1
%32 = sub i8 %31, 1
store i8 %32, i8* %1
%33 = load i8* %1
%34 = sub i8 %33, 1
store i8 %34, i8* %1
%35 = load i8* %1
%36 = sub i8 %35, 1
store i8 %36, i8* %1
%37 = load i8* %1
%38 = sub i8 %37, 1
store i8 %38, i8* %1
%39 = load i8* %1
%40 = sub i8 %39, 1
store i8 %40, i8* %1
%41 = load i8* %1
%42 = sub i8 %41, 1
store i8 %42, i8* %1
%43 = load i8* %1
%44 = sub i8 %43, 1
store i8 %44, i8* %1
%45 = load i8* %1
%46 = sub i8 %45, 1
store i8 %46, i8* %1
%47 = load i8* %1
%48 = sub i8 %47, 1
store i8 %48, i8* %1
%49 = load i8* %1
%50 = sub i8 %49, 1
store i8 %50, i8* %1
%51 = load i8* %1
%52 = sub i8 %51, 1
store i8 %52, i8* %1
%53 = load i8* %1
%54 = sub i8 %53, 1
store i8 %54, i8* %1
%55 = load i8* %1
%56 = sub i8 %55, 1
store i8 %56, i8* %1
%57 = load i8* %1
%58 = sub i8 %57, 1
store i8 %58, i8* %1
%59 = load i8* %1
%60 = sub i8 %59, 1
store i8 %60, i8* %1
%61 = load i8* %1
%62 = sub i8 %61, 1
store i8 %62, i8* %1
%63 = load i8* %1
%64 = sub i8 %63, 1
store i8 %64, i8* %1
%65 = load i8* %1
%66 = sub i8 %65, 1
store i8 %66, i8* %1
%67 = load i8* %1
%68 = sub i8 %67, 1
store i8 %68, i8* %1
%69 = load i8* %1
%70 = sub i8 %69, 1
store i8 %70, i8* %1
%71 = load i8* %1
%72 = sext i8 %71 to i32
%73 = call i32 @putchar(i32 %72)
%74 = call i32 @getchar()
%75 = trunc i32 %74 to i8
store i8 %75, i8* %1
%76 = load i8* %1
%77 = sub i8 %76, 1
store i8 %77, i8* %1
%78 = load i8* %1
%79 = sub i8 %78, 1
store i8 %79, i8* %1
%80 = load i8* %1
%81 = sub i8 %80, 1
store i8 %81, i8* %1
%82 = load i8* %1
%83 = sub i8 %82, 1
store i8 %83, i8* %1
%84 = load i8* %1
%85 = sub i8 %84, 1
store i8 %85, i8* %1
%86 = load i8* %1
%87 = sub i8 %86, 1
store i8 %87, i8* %1
%88 = load i8* %1
%89 = sub i8 %88, 1
store i8 %89, i8* %1
%90 = load i8* %1
%91 = sub i8 %90, 1
store i8 %91, i8* %1
%92 = load i8* %1
%93 = sub i8 %92, 1
store i8 %93, i8* %1
%94 = load i8* %1
%95 = sub i8 %94, 1
store i8 %95, i8* %1
%96 = load i8* %1
%97 = icmp ne i8 %96, 0
br i1 %97, label %26, label %98
; <label>:98 ; preds = %26, %0
%99 = load i8* %1
%100 = add i8 %99, 1
store i8 %100, i8* %1
%101 = load i8* %1
%102 = add i8 %101, 1
store i8 %102, i8* %1
%103 = load i8* %1
%104 = add i8 %103, 1
store i8 %104, i8* %1
%105 = load i8* %1
%106 = add i8 %105, 1
store i8 %106, i8* %1
%107 = load i8* %1
%108 = add i8 %107, 1
store i8 %108, i8* %1
%109 = load i8* %1
%110 = add i8 %109, 1
store i8 %110, i8* %1
%111 = load i8* %1
%112 = add i8 %111, 1
store i8 %112, i8* %1
%113 = load i8* %1
%114 = add i8 %113, 1
store i8 %114, i8* %1
%115 = load i8* %1
%116 = add i8 %115, 1
store i8 %116, i8* %1
%117 = load i8* %1
%118 = add i8 %117, 1
store i8 %118, i8* %1
%119 = load i8* %1
%120 = sext i8 %119 to i32
%121 = call i32 @putchar(i32 %120)
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

145
main.cpp Normal file
View file

@ -0,0 +1,145 @@
#include <llvm/ADT/ArrayRef.h>
#include <llvm/LLVMContext.h>
#include <llvm/Module.h>
#include <llvm/Function.h>
#include <llvm/BasicBlock.h>
#include <llvm/IRBuilder.h>
#include <llvm/Support/raw_ostream.h>
#include <memory>
#include <vector>
#include <string>
#include <fstream>
using namespace llvm;
class Brainfuck{
// Create a module
LLVMContext & context {getGlobalContext()};
Module module {"asdf", context};
// Get some basic types and sizes
Type* bool_type {IntegerType::getInt1Ty(context)};
Type* char_type {IntegerType::getInt8Ty(context)};
Type* int32_type {IntegerType::getInt32Ty(context)};
Value* char_size {ConstantExpr::getTruncOrBitCast(ConstantExpr::getSizeOf(char_type), int32_type)};
// Get some basic functions
Function* getchar_func {cast<Function>(module.getOrInsertFunction("getchar", IntegerType::getInt32Ty(context), nullptr))};
Function* putchar_func {cast<Function>(module.getOrInsertFunction("putchar", IntegerType::getInt32Ty(context), IntegerType::getInt32Ty(context), nullptr))};
Function* main_function {cast<Function>(module.getOrInsertFunction("main", Type::getInt32Ty(context), nullptr))};
// Builder for the main function
BasicBlock* entry {BasicBlock::Create(context, "", main_function)};
IRBuilder<> builder {entry};
// Malloc memory
const int memtotal = 100;
Value* total_memory {ConstantInt::get(int32_type, memtotal)};
Value* ptr_arr {CallInst::CreateMalloc(entry, int32_type, char_type, char_size, total_memory)};
Value* curhead {nullptr};
public:
Brainfuck(){
// Do the malloc thing and memset it
entry->getInstList().push_back(cast<Instruction>(ptr_arr));
builder.CreateMemSet(ptr_arr, ConstantInt::get(char_type, 0), total_memory, 1);
// Get head in the middle
curhead = builder.CreateGEP(ptr_arr, ConstantInt::get(int32_type, memtotal/2));
}
void fuck_it(std::string const & program){
// Parse brainfuck program
fuck_it_rec(program, program.begin());
// free and return 0
entry->getInstList().push_back(CallInst::CreateFree(ptr_arr, entry));
builder.CreateRet(ConstantInt::get(int32_type, 0));
}
void print(raw_ostream& os){
module.print(os, nullptr);
}
private:
void dec(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateSub(tape_0, ConstantInt::get(char_type, 1));
builder.CreateStore(tape_1, curhead);
}
void inc(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateAdd(tape_0, ConstantInt::get(char_type, 1));
builder.CreateStore(tape_1, curhead);
}
void put_it(){
auto tape_0 = builder.CreateLoad(curhead);
auto tape_1 = builder.CreateSExt(tape_0, int32_type);
builder.CreateCall(putchar_func, tape_1);
}
void get_it(){
auto tape_0 = builder.CreateCall(getchar_func);
auto tape_1 = builder.CreateTrunc(tape_0, char_type);
builder.CreateStore(tape_1, curhead);
}
std::string::const_iterator loop_it(std::string const & program, std::string::const_iterator it){
// I should merge some bits here... to inside the first label.
auto tape_0 = builder.CreateLoad(curhead);
auto cond = builder.CreateICmpNE(tape_0, ConstantInt::get(char_type, 0));
auto true_bb = BasicBlock::Create(context, "", main_function);
auto false_bb = BasicBlock::Create(context, "", main_function);
builder.CreateCondBr(cond, true_bb, false_bb);
builder.SetInsertPoint(true_bb);
it = fuck_it_rec(program, it);
tape_0 = builder.CreateLoad(curhead);
cond = builder.CreateICmpNE(tape_0, ConstantInt::get(char_type, 0));
builder.CreateCondBr(cond, true_bb, false_bb);
entry = false_bb;
builder.SetInsertPoint(false_bb);
return it;
}
std::string::const_iterator fuck_it_rec(std::string const & program, std::string::const_iterator it){
for(; it != program.end();){
auto c = *it++;
switch(c){
case ']' : return it;
case '>' : curhead = builder.CreateGEP(curhead, ConstantInt::get(int32_type, 1)); break;
case '<' : curhead = builder.CreateGEP(curhead, ConstantInt::get(int32_type, -1)); break;
case '+' : inc(); break;
case '-' : dec(); break;
case '.' : put_it(); break;
case ',' : get_it(); break;
case '[' : it = loop_it(program, it); break;
default : break;
}
}
return program.end();
}
};
int main(int argc, char ** argv){
assert(argc == 2);
std::string filename = argv[1];
std::ifstream file{filename, std::ios::binary};
std::string source{std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()};
// Initialise compiler
Brainfuck brain;
// Compile!
brain.fuck_it(source);
std::string error_info;
raw_fd_ostream os{(filename + ".ll").c_str(), error_info};
brain.print(os);
}

1
optimize.sh Executable file
View file

@ -0,0 +1 @@
echo '*** BEFORE OPTIMIZING ***' && ./build/LLVMCompiler && echo '*** AFTER OPTIMIZING: ***' && ./build/LLVMCompiler 2>&1 | opt -Oz -S

68
output Normal file
View file

@ -0,0 +1,68 @@
; ModuleID = 'asdf'
declare i32 @getchar()
declare i32 @putchar(i32)
define i32 @main() {
%malloccall = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8* null, i32 1) to i32), i32 100))
call void @llvm.memset.p0i8.i32(i8* %malloccall, i8 0, i32 100, i32 1, i1 false)
%1 = getelementptr i8* %malloccall, i32 50
%2 = load i8* %1
%3 = add i8 %2, 1
store i8 %3, i8* %1
%4 = load i8* %1
%5 = add i8 %4, 1
store i8 %5, i8* %1
%6 = load i8* %1
%7 = add i8 %6, 1
store i8 %7, i8* %1
%8 = load i8* %1
%9 = add i8 %8, 1
store i8 %9, i8* %1
%10 = load i8* %1
%11 = add i8 %10, 1
store i8 %11, i8* %1
%12 = load i8* %1
%13 = add i8 %12, 1
store i8 %13, i8* %1
%14 = load i8* %1
%15 = add i8 %14, 1
store i8 %15, i8* %1
%16 = load i8* %1
%17 = add i8 %16, 1
store i8 %17, i8* %1
%18 = load i8* %1
%19 = add i8 %18, 1
store i8 %19, i8* %1
%20 = load i8* %1
%21 = add i8 %20, 1
store i8 %21, i8* %1
%22 = load i8* %1
%23 = add i8 %22, 1
store i8 %23, i8* %1
%24 = load i8* %1
%25 = icmp ne i8 %24, 0
br i1 %25, label %26, label %34
; <label>:26 ; preds = %26, %0
%27 = load i8* %1
%28 = sext i8 %27 to i32
%29 = call i32 @putchar(i32 %28)
%30 = load i8* %1
%31 = sub i8 %30, 1
store i8 %31, i8* %1
%32 = load i8* %1
%33 = icmp ne i8 %32, 0
br i1 %33, label %26, label %34
; <label>:34 ; preds = %26, %0
tail call void @free(i8* %malloccall)
ret i32 0
}
declare noalias i8* @malloc(i32)
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
declare void @free(i8*)

2
run.sh Executable file
View file

@ -0,0 +1,2 @@
#./vanillabuild.sh && ./build/bfc.sh $1 && ./a.out | hexdump -C
./build/LLVMCompiler $1 && ~/Documents/Code/build/Release/bin/lli $1.ll | hexdump -C

5
vanillabuild.sh Executable file
View file

@ -0,0 +1,5 @@
mkdir -p build
cd build
cmake ..
make -j8
cd ..