aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS2
-rw-r--r--tests/cases/longjmp_tiny_keepem.ll40
-rw-r--r--tests/cases/longjmp_tiny_keepem.txt3
-rw-r--r--tests/cases/longjmp_tiny_keepem_cond.ll41
-rw-r--r--tests/cases/longjmp_tiny_keepem_cond.txt3
-rw-r--r--tools/file_packager.py19
-rw-r--r--tools/shared.py2
7 files changed, 102 insertions, 8 deletions
diff --git a/AUTHORS b/AUTHORS
index fc947687..9e01eb42 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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