diff options
-rw-r--r-- | AUTHORS | 2 | ||||
-rw-r--r-- | tests/cases/longjmp_tiny_keepem.ll | 40 | ||||
-rw-r--r-- | tests/cases/longjmp_tiny_keepem.txt | 3 | ||||
-rw-r--r-- | tests/cases/longjmp_tiny_keepem_cond.ll | 41 | ||||
-rw-r--r-- | tests/cases/longjmp_tiny_keepem_cond.txt | 3 | ||||
-rw-r--r-- | tools/file_packager.py | 19 | ||||
-rw-r--r-- | tools/shared.py | 2 |
7 files changed, 102 insertions, 8 deletions
@@ -121,3 +121,5 @@ a license to everyone to use it as detailed in LICENSE.) * Sindre Sorhus <sindresorhus@gmail.com> * James S Urquhart <jamesu@gmail.com> * Boris Gjenero <boris.gjenero@gmail.com> +* jonas echterhoff <jonas@unity3d.com> + diff --git a/tests/cases/longjmp_tiny_keepem.ll b/tests/cases/longjmp_tiny_keepem.ll new file mode 100644 index 00000000..bbf9b3e8 --- /dev/null +++ b/tests/cases/longjmp_tiny_keepem.ll @@ -0,0 +1,40 @@ +; ModuleID = '/tmp/emscripten_temp/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-S128" +target triple = "i386-pc-linux-gnu" + +@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 +@.str1 = private unnamed_addr constant [6 x i8] c"more\0A\00", align 1 + +define i32 @main() { + %call0 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)) + br label %middle + +middle: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %wimpy = trunc i32 100 to i8 + %buffy = inttoptr i8 %wimpy to i16* + %call = call i32 @setjmp(i16* %buffy) returns_twice ; 20 + %tobool = icmp ne i32 %call, 0 ; 20 + br i1 %tobool, label %if.else, label %if.then ; 20 + +if.then: ; preds = %entry + %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0)) ; 22 + call void @longjmp(i8 %wimpy, i32 10) ; 24 + br label %if.end ; 25 + +if.else: ; preds = %entry + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)) ; 26 + br label %if.end + +if.end: ; preds = %if.else, %if.then + ret i32 0 ; 28 +} + +declare i32 @setjmp(i16*) returns_twice + +declare i32 @printf(i8*, ...) + +declare void @longjmp(i8, i32) + + diff --git a/tests/cases/longjmp_tiny_keepem.txt b/tests/cases/longjmp_tiny_keepem.txt new file mode 100644 index 00000000..f828705f --- /dev/null +++ b/tests/cases/longjmp_tiny_keepem.txt @@ -0,0 +1,3 @@ +more +hello world +more diff --git a/tests/cases/longjmp_tiny_keepem_cond.ll b/tests/cases/longjmp_tiny_keepem_cond.ll new file mode 100644 index 00000000..694ed17f --- /dev/null +++ b/tests/cases/longjmp_tiny_keepem_cond.ll @@ -0,0 +1,41 @@ +; ModuleID = '/tmp/emscripten_temp/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-S128" +target triple = "i386-pc-linux-gnu" + +@.str = private unnamed_addr constant [13 x i8] c"hello world\0A\00", align 1 +@.str1 = private unnamed_addr constant [6 x i8] c"more\0A\00", align 1 + +define i32 @main() { + %call0 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)) + %chak = icmp ne i32 %call0, 12345678 + br i1 %chak, label %middle, label %if.then + +middle: + %retval = alloca i32, align 4 + store i32 0, i32* %retval + %wimpy = trunc i32 100 to i8 + %buffy = inttoptr i8 %wimpy to i16* + %call = call i32 @setjmp(i16* %buffy) returns_twice ; 20 + %tobool = icmp ne i32 %call, 0 ; 20 + br i1 %tobool, label %if.else, label %if.then ; 20 + +if.then: ; preds = %entry + %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str, i32 0, i32 0)) ; 22 + call void @longjmp(i8 %wimpy, i32 10) ; 24 + br label %if.end ; 25 + +if.else: ; preds = %entry + %call2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x i8]* @.str1, i32 0, i32 0)) ; 26 + br label %if.end + +if.end: ; preds = %if.else, %if.then + ret i32 0 ; 28 +} + +declare i32 @setjmp(i16*) returns_twice + +declare i32 @printf(i8*, ...) + +declare void @longjmp(i8, i32) + + diff --git a/tests/cases/longjmp_tiny_keepem_cond.txt b/tests/cases/longjmp_tiny_keepem_cond.txt new file mode 100644 index 00000000..f828705f --- /dev/null +++ b/tests/cases/longjmp_tiny_keepem_cond.txt @@ -0,0 +1,3 @@ +more +hello world +more diff --git a/tools/file_packager.py b/tools/file_packager.py index 448bb994..aa70ac6a 100644 --- a/tools/file_packager.py +++ b/tools/file_packager.py @@ -469,6 +469,8 @@ if has_preloaded: package_uuid = uuid.uuid4(); remote_package_name = os.path.basename(Compression.compressed_name(data_target) if Compression.on else data_target) + statinfo = os.stat(remote_package_name) + remote_package_size = statinfo.st_size ret += r''' var PACKAGE_PATH; if (typeof window === 'object') { @@ -479,8 +481,9 @@ if has_preloaded: } var PACKAGE_NAME = '%s'; var REMOTE_PACKAGE_NAME = (Module['filePackagePrefixURL'] || '') + '%s'; + var REMOTE_PACKAGE_SIZE = %d; var PACKAGE_UUID = '%s'; - ''' % (data_target, remote_package_name, package_uuid) + ''' % (data_target, remote_package_name, remote_package_size, package_uuid) if use_preload_cache: code += r''' @@ -574,19 +577,21 @@ if has_preloaded: ''' ret += r''' - function fetchRemotePackage(packageName, callback, errback) { + function fetchRemotePackage(packageName, packageSize, callback, errback) { var xhr = new XMLHttpRequest(); xhr.open('GET', packageName, true); xhr.responseType = 'arraybuffer'; xhr.onprogress = function(event) { var url = packageName; - if (event.loaded && event.total) { + var size = packageSize; + if (event.total) size = event.total; + if (event.loaded) { if (!xhr.addedTotal) { xhr.addedTotal = true; if (!Module.dataFileDownloads) Module.dataFileDownloads = {}; Module.dataFileDownloads[url] = { loaded: event.loaded, - total: event.total + total: size }; } else { Module.dataFileDownloads[url].loaded = event.loaded; @@ -638,7 +643,7 @@ if has_preloaded: function preloadFallback(error) { console.error(error); console.error('falling back to default preload behavior'); - fetchRemotePackage(REMOTE_PACKAGE_NAME, processPackageData, handleError); + fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, processPackageData, handleError); }; openDatabase( @@ -651,7 +656,7 @@ if has_preloaded: fetchCachedPackage(db, PACKAGE_PATH + PACKAGE_NAME, processPackageData, preloadFallback); } else { console.info('loading ' + PACKAGE_NAME + ' from remote'); - fetchRemotePackage(REMOTE_PACKAGE_NAME, + fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function(packageData) { cacheRemotePackage(db, PACKAGE_PATH + PACKAGE_NAME, packageData, {uuid:PACKAGE_UUID}, processPackageData, function(error) { @@ -673,7 +678,7 @@ if has_preloaded: # Only tricky bit is the fetch is async, but also when runWithFS is called is async, so we handle both orderings. ret += r''' var fetched = null, fetchedCallback = null; - fetchRemotePackage(REMOTE_PACKAGE_NAME, function(data) { + fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function(data) { if (fetchedCallback) { fetchedCallback(data); fetchedCallback = null; diff --git a/tools/shared.py b/tools/shared.py index 764877ba..a675501f 100644 --- a/tools/shared.py +++ b/tools/shared.py @@ -1167,7 +1167,7 @@ class Building: #opts += ['-debug-pass=Arguments'] if get_clang_version() == '3.4' and not Settings.SIMD: opts += ['-disable-loop-vectorization', '-disable-slp-vectorization'] # llvm 3.4 has these on by default - logging.debug('emcc: LLVM opts: ' + str(opts)) + logging.debug('emcc: LLVM opts: ' + ' '.join(opts)) target = out or (filename + '.opt.bc') output = Popen([LLVM_OPT, filename] + opts + ['-o', target], stdout=PIPE).communicate()[0] assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output |