diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/cases/storestruct.ll | 84 | ||||
-rw-r--r-- | tests/cases/storestruct.txt | 3 | ||||
-rw-r--r-- | tests/runner.py | 26 |
3 files changed, 108 insertions, 5 deletions
diff --git a/tests/cases/storestruct.ll b/tests/cases/storestruct.ll new file mode 100644 index 00000000..15022e2f --- /dev/null +++ b/tests/cases/storestruct.ll @@ -0,0 +1,84 @@ +; ModuleID = '/dev/shm/tmp/src.cpp.o' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32" +target triple = "i386-pc-linux-gnu" + +; Load and store an entire structure as a whole (and also load as a whole, extract values and save separately, etc.) + +%struct.X = type { i32, i32 } + +@.str = private unnamed_addr constant [9 x i8] c"*%d,%d*\0A\00" ; [#uses=1] + +; [#uses=0] +define i32 @main() { +entry: + %retval = alloca i32, align 4 ; [#uses=1] + %x = alloca %struct.X, align 4 ; [#uses=2] + %y = alloca %struct.X, align 4 ; [#uses=2] + store i32 0, i32* %retval + call void @llvm.dbg.declare(metadata !{%struct.X* %x}, metadata !6), !dbg !13 + call void @llvm.dbg.declare(metadata !{%struct.X* %y}, metadata !14), !dbg !15 + %a = getelementptr inbounds %struct.X* %x, i32 0, i32 0, !dbg !16 ; [#uses=1] + store i32 5, i32* %a, align 4, !dbg !16 + %b = getelementptr inbounds %struct.X* %x, i32 0, i32 1, !dbg !17 ; [#uses=1] + store i32 22, i32* %b, align 4, !dbg !17 + + %allx = load %struct.X* %x, align 4, !dbg !13 ; [#uses=1] + store %struct.X %allx, %struct.X* %y, align 4, !dbg !15 + + %a1 = getelementptr inbounds %struct.X* %y, i32 0, i32 0, !dbg !18 ; [#uses=1] + %tmp = load i32* %a1, align 4, !dbg !18 ; [#uses=1] + %b2 = getelementptr inbounds %struct.X* %y, i32 0, i32 1, !dbg !18 ; [#uses=1] + %tmp3 = load i32* %b2, align 4, !dbg !18 ; [#uses=1] + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp, i32 %tmp3), !dbg !18 ; [#uses=0] + + store i32 7, i32* %a, align 4, !dbg !16 + store i32 96, i32* %b, align 4, !dbg !17 + %allx2 = load %struct.X* %x, align 4, !dbg !13 ; [#uses=1] + + %x_a = extractvalue %struct.X %allx2, 0 ; [#uses=1] + store i32 %x_a, i32* %a1, align 4 + %x_b = extractvalue %struct.X %allx2, 1 ; [#uses=1] + store i32 %x_b, i32* %b2, align 4 + + %tmp5 = load i32* %a1, align 4, !dbg !18 ; [#uses=1] + %tmp6 = load i32* %b2, align 4, !dbg !18 ; [#uses=1] + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5, i32 %tmp6), !dbg !18 ; [#uses=0] + + %ptr = inttoptr i32 52 to i32* ; [#uses=1] + store %struct.X { i32 ptrtoint (i32* getelementptr inbounds (i32* %ptr, i32 1, i32 0) to i32), i32 3 }, %struct.X* %y, align 4 ; store entire struct at once + + %tmp5 = load i32* %a1, align 4, !dbg !18 ; [#uses=1] + %tmp6 = load i32* %b2, align 4, !dbg !18 ; [#uses=1] + %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([9 x i8]* @.str, i32 0, i32 0), i32 %tmp5, i32 %tmp6), !dbg !18 ; [#uses=0] + + ret i32 0, !dbg !19 +} + +; [#uses=2] +declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone + +; [#uses=1] +declare i32 @printf(i8*, ...) + +!llvm.dbg.sp = !{!0} + +!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"", metadata !1, i32 5, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ] +!1 = metadata !{i32 589865, metadata !"/dev/shm/tmp/src.cpp", metadata !"/dev/shm/tmp", metadata !2} ; [ DW_TAG_file_type ] +!2 = metadata !{i32 589841, i32 0, i32 4, metadata !"/dev/shm/tmp/src.cpp", metadata !"/dev/shm/tmp", metadata !"clang version 2.9 (tags/RELEASE_29/final)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] +!3 = metadata !{i32 589845, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i32 0, i32 0, i32 0, metadata !4, i32 0, i32 0} ; [ DW_TAG_subroutine_type ] +!4 = metadata !{metadata !5} +!5 = metadata !{i32 589860, metadata !2, metadata !"int", null, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ] +!6 = metadata !{i32 590080, metadata !7, metadata !"x", metadata !1, i32 6, metadata !8, i32 0} ; [ DW_TAG_auto_variable ] +!7 = metadata !{i32 589835, metadata !0, i32 5, i32 11, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] +!8 = metadata !{i32 589826, metadata !2, metadata !"X", metadata !1, i32 3, i64 64, i64 32, i32 0, i32 0, null, metadata !9, i32 0, null, metadata !12} ; [ DW_TAG_class_type ] +!9 = metadata !{metadata !10, metadata !11} +!10 = metadata !{i32 589837, metadata !1, metadata !"a", metadata !1, i32 3, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ] +!11 = metadata !{i32 589837, metadata !1, metadata !"b", metadata !1, i32 3, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ] +!12 = metadata !{i32 0} +!13 = metadata !{i32 6, i32 3, metadata !7, null} +!14 = metadata !{i32 590080, metadata !7, metadata !"y", metadata !1, i32 6, metadata !8, i32 0} ; [ DW_TAG_auto_variable ] +!15 = metadata !{i32 6, i32 6, metadata !7, null} +!16 = metadata !{i32 7, i32 1, metadata !7, null} +!17 = metadata !{i32 8, i32 1, metadata !7, null} +!18 = metadata !{i32 9, i32 13, metadata !7, null} +!19 = metadata !{i32 10, i32 13, metadata !7, null} diff --git a/tests/cases/storestruct.txt b/tests/cases/storestruct.txt new file mode 100644 index 00000000..e52a6bf5 --- /dev/null +++ b/tests/cases/storestruct.txt @@ -0,0 +1,3 @@ +*5,22* +*7,96* +*56,3* diff --git a/tests/runner.py b/tests/runner.py index e7cdcff1..ec47416f 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -60,7 +60,12 @@ class RunnerCore(unittest.TestCase): # Similar to LLVM::createStandardModulePasses() def pick_llvm_opts(self, optimization_level, optimize_size, allow_nonportable=False): - global LLVM_OPT_OPTS + global LLVM_OPT_OPTS, USE_TYPED_ARRAYS + + #if USE_TYPED_ARRAYS == 2: # unsafe optimizations. TODO: fix all issues blocking this from being used + # LLVM_OPT_OPTS = ['-O3'] + # return + LLVM_OPT_OPTS = pick_llvm_opts(optimization_level, optimize_size, allow_nonportable) # Emscripten optimizations that we run on the .ll file @@ -173,7 +178,7 @@ class RunnerCore(unittest.TestCase): def do_emscripten(self, filename, output_processor=None, append_ext=True, extra_args=[]): # Run Emscripten exported_settings = {} - for setting in ['QUANTUM_SIZE', 'RELOOP', 'OPTIMIZE', 'ASSERTIONS', 'USE_TYPED_ARRAYS', 'SAFE_HEAP', 'CHECK_OVERFLOWS', 'CORRECT_OVERFLOWS', 'CORRECT_SIGNS', 'CHECK_SIGNS', 'CORRECT_OVERFLOWS_LINES', 'CORRECT_SIGNS_LINES', 'CORRECT_ROUNDINGS', 'CORRECT_ROUNDINGS_LINES', 'INVOKE_RUN', 'SAFE_HEAP_LINES', 'INIT_STACK', 'AUTO_OPTIMIZE', 'EXPORTED_FUNCTIONS', 'EXPORTED_GLOBALS', 'BUILD_AS_SHARED_LIB', 'INCLUDE_FULL_LIBRARY', 'RUNTIME_TYPE_INFO']: + for setting in ['QUANTUM_SIZE', 'RELOOP', 'OPTIMIZE', 'ASSERTIONS', 'USE_TYPED_ARRAYS', 'SAFE_HEAP', 'CHECK_OVERFLOWS', 'CORRECT_OVERFLOWS', 'CORRECT_SIGNS', 'CHECK_SIGNS', 'CORRECT_OVERFLOWS_LINES', 'CORRECT_SIGNS_LINES', 'CORRECT_ROUNDINGS', 'CORRECT_ROUNDINGS_LINES', 'INVOKE_RUN', 'SAFE_HEAP_LINES', 'INIT_STACK', 'AUTO_OPTIMIZE', 'EXPORTED_FUNCTIONS', 'EXPORTED_GLOBALS', 'BUILD_AS_SHARED_LIB', 'INCLUDE_FULL_LIBRARY', 'RUNTIME_TYPE_INFO', 'DISABLE_EXCEPTIONS']: try: value = eval(setting) exported_settings[setting] = value @@ -950,6 +955,10 @@ if 'benchmark' not in sys.argv: ''' self.do_test(src, '*throw...caught!infunc...done!*') + global DISABLE_EXCEPTIONS + DISABLE_EXCEPTIONS = 1 + self.do_test(src, 'Compiled code throwing an exception') + def test_class(self): src = ''' #include <stdio.h> @@ -2724,6 +2733,7 @@ if 'benchmark' not in sys.argv: global CHECK_OVERFLOWS; CHECK_OVERFLOWS = 0 self.do_test(path_from_root('tests', 'cubescript'), '*\nTemp is 33\n9\n5\nhello, everyone\n*', main_file='command.cpp') + #build_ll_hook=self.do_autodebug) def test_gcc_unmangler(self): self.do_test(path_from_root('third_party'), '*d_demangle(char const*, int, unsigned int*)*', args=['_ZL10d_demanglePKciPj'], main_file='gcc_demangler.c') @@ -3159,6 +3169,8 @@ if 'benchmark' not in sys.argv: # Way 2: use CppHeaderParser + global RUNTIME_TYPE_INFO; RUNTIME_TYPE_INFO = 1 + header = ''' #include <stdio.h> @@ -3334,13 +3346,16 @@ Child2:9 print('|' + Runtime.typeInfo.UserStruct.fields + '|' + Runtime.typeInfo.UserStruct.flatIndexes + '|'); var t = Runtime.generateStructInfo(['x', { us: ['x', 'y', 'z'] }, 'y'], 'Encloser') print('|' + [t.x, t.us.x, t.us.y, t.us.z, t.y] + '|'); + print('|' + JSON.stringify(Runtime.generateStructInfo(null, 'UserStruct')) + '|'); } else { print('No type info.'); } ''' ) open(filename, 'w').write(src) - self.do_test(src, '*ok:5*\n|i32,i8,i16|0,4,6|\n|0,4,8,10,12|', post_build=post) + self.do_test(src, + '*ok:5*\n|i32,i8,i16|0,4,6|\n|0,4,8,10,12|\n|{"__size__":8,"x":0,"y":4,"z":6}|', + post_build=post) # Make sure that without the setting, we don't spam the .js with the type info RUNTIME_TYPE_INFO = 0 @@ -3668,7 +3683,7 @@ Child2:9 exec(''' class %s(T): def setUp(self): - global COMPILER, QUANTUM_SIZE, RELOOP, OPTIMIZE, ASSERTIONS, USE_TYPED_ARRAYS, LLVM_OPTS, SAFE_HEAP, CHECK_OVERFLOWS, CORRECT_OVERFLOWS, CORRECT_OVERFLOWS_LINES, CORRECT_SIGNS, CORRECT_SIGNS_LINES, CHECK_SIGNS, COMPILER_TEST_OPTS, CORRECT_ROUNDINGS, CORRECT_ROUNDINGS_LINES, INVOKE_RUN, SAFE_HEAP_LINES, INIT_STACK, AUTO_OPTIMIZE, RUNTIME_TYPE_INFO + global COMPILER, QUANTUM_SIZE, RELOOP, OPTIMIZE, ASSERTIONS, USE_TYPED_ARRAYS, LLVM_OPTS, SAFE_HEAP, CHECK_OVERFLOWS, CORRECT_OVERFLOWS, CORRECT_OVERFLOWS_LINES, CORRECT_SIGNS, CORRECT_SIGNS_LINES, CHECK_SIGNS, COMPILER_TEST_OPTS, CORRECT_ROUNDINGS, CORRECT_ROUNDINGS_LINES, INVOKE_RUN, SAFE_HEAP_LINES, INIT_STACK, AUTO_OPTIMIZE, RUNTIME_TYPE_INFO, DISABLE_EXCEPTIONS COMPILER = '%s' llvm_opts = %d @@ -3691,6 +3706,7 @@ class %s(T): CHECK_SIGNS = 0 #1-(embetter or llvm_opts) INIT_STACK = 0 RUNTIME_TYPE_INFO = 0 + DISABLE_EXCEPTIONS = 0 if LLVM_OPTS: self.pick_llvm_opts(3, True) COMPILER_TEST_OPTS = ['-g'] @@ -3742,7 +3758,7 @@ else: QUANTUM_SIZE = 1 RELOOP = OPTIMIZE = 1 USE_TYPED_ARRAYS = 0 - ASSERTIONS = SAFE_HEAP = CHECK_OVERFLOWS = CORRECT_OVERFLOWS = CHECK_SIGNS = INIT_STACK = AUTO_OPTIMIZE = RUNTIME_TYPE_INFO = 0 + ASSERTIONS = SAFE_HEAP = CHECK_OVERFLOWS = CORRECT_OVERFLOWS = CHECK_SIGNS = INIT_STACK = AUTO_OPTIMIZE = RUNTIME_TYPE_INFO = DISABLE_EXCEPTIONS = 0 INVOKE_RUN = 1 CORRECT_SIGNS = 0 CORRECT_ROUNDINGS = 0 |