aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEhsan Akhgari <ehsan.akhgari@gmail.com>2012-02-08 16:28:03 -0500
committerEhsan Akhgari <ehsan.akhgari@gmail.com>2012-02-08 18:52:19 -0500
commit96dfd8be059f1657e217177a9cc3cbe5e8d9aa46 (patch)
treeff9b5cbe361238031d67636036913354e1725bcd
parent1506ae0d6dc95f9d16cd1eb7a1e3f480fbeaca24 (diff)
Add a test for handling of multiply defined symbols
-rwxr-xr-xtests/runner.py40
-rw-r--r--tools/shared.py7
2 files changed, 47 insertions, 0 deletions
diff --git a/tests/runner.py b/tests/runner.py
index a407dc13..a7624612 100755
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -919,6 +919,46 @@ if 'benchmark' not in str(sys.argv) and 'sanity' not in str(sys.argv):
'''
self.do_run(src, '*1 2*')
+ def test_multiply_defined_symbols(self):
+ a1 = "int f() { return 1; }"
+ a1_name = os.path.join(self.get_dir(), 'a1.c')
+ open(a1_name, 'w').write(a1)
+ a2 = "void x() {}"
+ a2_name = os.path.join(self.get_dir(), 'a2.c')
+ open(a2_name, 'w').write(a2)
+ b1 = "int f() { return 2; }"
+ b1_name = os.path.join(self.get_dir(), 'b1.c')
+ open(b1_name, 'w').write(b1)
+ b2 = "void y() {}"
+ b2_name = os.path.join(self.get_dir(), 'b2.c')
+ open(b2_name, 'w').write(b2)
+ main = r'''
+ #include <stdio.h>
+ int f();
+ int main() {
+ printf("result: %d\n", f());
+ return 0;
+ }
+ '''
+ main_name = os.path.join(self.get_dir(), 'main.c')
+ open(main_name, 'w').write(main)
+
+ Building.emcc(a1_name)
+ Building.emcc(a2_name)
+ Building.emcc(b1_name)
+ Building.emcc(b2_name)
+ Building.emcc(main_name)
+
+ liba_name = os.path.join(self.get_dir(), 'liba.a')
+ Building.emar('cr', liba_name, [a1_name + '.o', a2_name + '.o'])
+ libb_name = os.path.join(self.get_dir(), 'libb.a')
+ Building.emar('cr', libb_name, [b1_name + '.o', b2_name + '.o'])
+
+ all_name = os.path.join(self.get_dir(), 'all.bc')
+ Building.link([main_name + '.o', liba_name, libb_name], all_name)
+
+ self.do_ll_run(all_name, 'result: 1')
+
def test_if(self):
src = '''
#include <stdio.h>
diff --git a/tools/shared.py b/tools/shared.py
index 832dcb26..56a404fb 100644
--- a/tools/shared.py
+++ b/tools/shared.py
@@ -547,6 +547,13 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)'''.replace('$EMSCRIPTEN_ROOT', path_
assert os.path.exists(output_filename), 'emcc could not create output file'
@staticmethod
+ def emar(action, output_filename, filenames, stdout=None, stderr=None, env=None):
+ try_delete(output_filename)
+ Popen([EMAR, action, output_filename] + filenames, stdout=stdout, stderr=stderr, env=env).communicate()
+ if 'c' in action:
+ assert os.path.exists(output_filename), 'emar could not create output file'
+
+ @staticmethod
def emscripten(filename, append_ext=True, extra_args=[]):
# Allow usage of emscripten.py without warning
os.environ['EMSCRIPTEN_SUPPRESS_USAGE_WARNING'] = '1'