Centralize debug options in a -gX flag.
This commit is contained in:
Родитель
610388440c
Коммит
3a84846ded
77
emcc
77
emcc
|
@ -182,7 +182,7 @@ Options that are modified or new in %s include:
|
|||
). Note that the path must be absolute, not
|
||||
relative.
|
||||
|
||||
-g Use debug info. Note that you need this during
|
||||
-g or -g1 Use debug info. Note that you need this during
|
||||
the last compilation phase from bitcode to
|
||||
JavaScript, or else we will remove it by
|
||||
default in -O1 and above.
|
||||
|
@ -193,6 +193,11 @@ Options that are modified or new in %s include:
|
|||
causes name mangling or minification (closure
|
||||
or the registerize pass).
|
||||
|
||||
-g2 Like -g1, but we generate source maps as well,
|
||||
and we preserve comments even with -O1 and above.
|
||||
Note that this may be considerably slower because
|
||||
JS optimization is limited to a single core.
|
||||
|
||||
--typed-arrays <mode> 0: No typed arrays
|
||||
1: Parallel typed arrays
|
||||
2: Shared (C-like) typed arrays (default)
|
||||
|
@ -689,6 +694,7 @@ try:
|
|||
newargs = sys.argv[1:]
|
||||
|
||||
opt_level = 0
|
||||
debug_level = 0
|
||||
llvm_opts = None
|
||||
llvm_lto = None
|
||||
closure = None
|
||||
|
@ -703,14 +709,11 @@ try:
|
|||
ignore_dynamic_linking = False
|
||||
shell_path = shared.path_from_root('src', 'shell.html')
|
||||
js_libraries = []
|
||||
keep_llvm_debug = False
|
||||
keep_js_debug = False
|
||||
bind = False
|
||||
jcache = False
|
||||
save_bc = False
|
||||
memory_init_file = False
|
||||
use_preload_cache = False
|
||||
make_source_map = False
|
||||
|
||||
if use_cxx:
|
||||
default_cxx_std = '-std=c++03' # Enforce a consistent C++ standard when compiling .cpp files, if user does not specify one on the cmdline.
|
||||
|
@ -724,6 +727,14 @@ try:
|
|||
|
||||
settings_changes = []
|
||||
|
||||
def validate_arg_level(level_string, max_level):
|
||||
try:
|
||||
level = int(level_string)
|
||||
assert 0 <= level <= max_level
|
||||
except:
|
||||
raise Exception('Invalid argument value: ' + newargs[i])
|
||||
return level
|
||||
|
||||
for i in range(len(newargs)):
|
||||
newargs[i] = newargs[i].strip() # On Windows Vista (and possibly others), excessive spaces in the command line leak into the items in this array, so trim e.g. 'foo.cpp ' -> 'foo.cpp'
|
||||
if newargs[i].startswith('-O'):
|
||||
|
@ -732,11 +743,7 @@ try:
|
|||
if requested_level == 's':
|
||||
requested_level = 2
|
||||
settings_changes.append('INLINING_LIMIT=50')
|
||||
try:
|
||||
opt_level = int(requested_level)
|
||||
assert 0 <= opt_level <= 3
|
||||
except:
|
||||
raise Exception('Invalid optimization level: ' + newargs[i])
|
||||
opt_level = validate_arg_level(requested_level, 3)
|
||||
newargs[i] = ''
|
||||
elif newargs[i].startswith('--llvm-opts'):
|
||||
check_bad_eq(newargs[i])
|
||||
|
@ -778,12 +785,11 @@ try:
|
|||
split_js_file = int(newargs[i+1])
|
||||
newargs[i] = ''
|
||||
newargs[i+1] = ''
|
||||
elif newargs[i] == '-g':
|
||||
keep_llvm_debug = True
|
||||
keep_js_debug = True
|
||||
elif newargs[i] == '--map':
|
||||
make_source_map = True
|
||||
newargs[i] = '-g' # we'll need this to get LLVM debug info
|
||||
elif newargs[i].startswith('-g'):
|
||||
requested_level = newargs[i][2:] or '1'
|
||||
debug_level = validate_arg_level(requested_level, 2)
|
||||
if debug_level > 0:
|
||||
newargs[i] = '-g' # we'll need this to get LLVM debug info
|
||||
elif newargs[i] == '--bind':
|
||||
bind = True
|
||||
newargs[i] = ''
|
||||
|
@ -872,11 +878,14 @@ try:
|
|||
|
||||
if llvm_opts is None: llvm_opts = LLVM_OPT_LEVEL[opt_level]
|
||||
if llvm_lto is None: llvm_lto = opt_level >= 3
|
||||
if opt_level <= 0: keep_llvm_debug = keep_js_debug = True # always keep debug in -O0
|
||||
if opt_level > 0: keep_llvm_debug = False # JS optimizer wipes out llvm debug info
|
||||
if make_source_map: keep_llvm_debug = True; keep_js_debug = True
|
||||
if opt_level <= 0: debug_level = max(debug_level, 1) # always keep debug in -O0
|
||||
if closure is None and opt_level == 3: closure = True
|
||||
|
||||
# TODO: support source maps with js_transform
|
||||
if js_transform and debug_level >= 2:
|
||||
logging.warning('disabling source maps because a js transform is being done')
|
||||
debug_level = 1
|
||||
|
||||
if DEBUG: start_time = time.time() # done after parsing arguments, which might affect debug state
|
||||
|
||||
if closure:
|
||||
|
@ -1023,15 +1032,12 @@ try:
|
|||
if shared.Settings.ASSERTIONS and shared.Settings.ALIASING_FUNCTION_POINTERS:
|
||||
logging.warning('ALIASING_FUNCTION_POINTERS is on, function pointer comparisons may be invalid across types')
|
||||
|
||||
if shared.Settings.CORRECT_SIGNS >= 2 or shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2:
|
||||
keep_llvm_debug = True # must keep debug info to do line-by-line operations
|
||||
|
||||
if (keep_llvm_debug or keep_js_debug) and closure:
|
||||
if debug_level >= 1 and closure:
|
||||
logging.warning('disabling closure because debug info was requested')
|
||||
closure = False
|
||||
|
||||
if minify_whitespace is None:
|
||||
minify_whitespace = opt_level >= 2 and not keep_js_debug
|
||||
minify_whitespace = opt_level >= 2 and debug_level == 0
|
||||
|
||||
assert shared.LLVM_TARGET in shared.COMPILER_OPTS
|
||||
if shared.LLVM_TARGET == 'i386-pc-linux-gnu':
|
||||
|
@ -1401,7 +1407,13 @@ try:
|
|||
|
||||
# Optimize, if asked to
|
||||
if not LEAVE_INPUTS_RAW:
|
||||
link_opts = [] if keep_llvm_debug else ['-strip-debug'] # remove LLVM debug info in -O1+, since the optimizer removes it anyhow
|
||||
|
||||
if opt_level == 0 or debug_level >= 2 or shared.Settings.CORRECT_SIGNS >= 2 or \
|
||||
shared.Settings.CORRECT_OVERFLOWS >= 2 or shared.Settings.CORRECT_ROUNDINGS >= 2:
|
||||
link_opts = []
|
||||
else:
|
||||
link_opts = ['-strip-debug'] # remove LLVM debug info in -O1+, since the optimizer removes it anyhow
|
||||
|
||||
if llvm_opts > 0:
|
||||
if not os.environ.get('EMCC_OPTIMIZE_NORMALLY'):
|
||||
shared.Building.llvm_opt(in_temp(target_basename + '.bc'), llvm_opts)
|
||||
|
@ -1485,9 +1497,6 @@ try:
|
|||
|
||||
# Apply a source code transformation, if requested
|
||||
if js_transform:
|
||||
# TODO: support source maps with js_transform
|
||||
logging.warning('disabling source maps because a js transform is being done')
|
||||
make_source_map = False
|
||||
shutil.copyfile(final, final + '.tr.js')
|
||||
final += '.tr.js'
|
||||
posix = True if not shared.WINDOWS else False
|
||||
|
@ -1506,7 +1515,7 @@ try:
|
|||
if shared.Settings.ASM_JS:
|
||||
js_optimizer_queue = ['asm'] + js_optimizer_queue
|
||||
logging.debug('applying js optimization passes: %s', js_optimizer_queue)
|
||||
final = shared.Building.js_optimizer(final, js_optimizer_queue, jcache, make_source_map)
|
||||
final = shared.Building.js_optimizer(final, js_optimizer_queue, jcache, debug_level >= 2)
|
||||
js_transform_tempfiles.append(final)
|
||||
if DEBUG: save_intermediate('js_opts')
|
||||
else:
|
||||
|
@ -1515,7 +1524,7 @@ try:
|
|||
if shared.Settings.ASM_JS:
|
||||
passes = ['asm'] + passes
|
||||
logging.debug('applying js optimization pass: %s', passes)
|
||||
final = shared.Building.js_optimizer(final, passes, jcache, make_source_map)
|
||||
final = shared.Building.js_optimizer(final, passes, jcache, debug_level >= 2)
|
||||
js_transform_tempfiles.append(final)
|
||||
save_intermediate(name)
|
||||
js_optimizer_queue = []
|
||||
|
@ -1525,7 +1534,7 @@ try:
|
|||
|
||||
if DEBUG == '2':
|
||||
# Clean up the syntax a bit
|
||||
final = shared.Building.js_optimizer(final, [], jcache, make_source_map)
|
||||
final = shared.Building.js_optimizer(final, [], jcache, debug_level >= 2)
|
||||
js_transform_tempfiles.append(final)
|
||||
if DEBUG: save_intermediate('pretty')
|
||||
|
||||
|
@ -1545,7 +1554,7 @@ try:
|
|||
|
||||
logging.debug('running closure')
|
||||
# no need to add this to js_transform_tempfiles, because closure and
|
||||
# keep_js_debug are never simultaneously true
|
||||
# debug_level > 0 are never simultaneously true
|
||||
final = shared.Building.closure_compiler(final)
|
||||
if DEBUG: save_intermediate('closure')
|
||||
|
||||
|
@ -1553,7 +1562,7 @@ try:
|
|||
logging.debug('running post-closure post-opts')
|
||||
js_optimizer_queue += ['simplifyExpressionsPost']
|
||||
|
||||
if (not closure or shared.Settings.ASM_JS) and shared.Settings.RELOOP and not keep_js_debug:
|
||||
if (not closure or shared.Settings.ASM_JS) and shared.Settings.RELOOP and debug_level == 0:
|
||||
# do this if closure is not enabled (it gives similar speedups), and we do not need to keep debug info around
|
||||
js_optimizer_queue += ['registerize']
|
||||
|
||||
|
@ -1614,7 +1623,7 @@ try:
|
|||
shell = open(shell_path).read()
|
||||
html = open(target, 'w')
|
||||
if not Compression.on:
|
||||
if make_source_map:
|
||||
if debug_level >= 2:
|
||||
match = re.match('.*?<script[^>]*>{{{ SCRIPT_CODE }}}</script>', shell,
|
||||
re.DOTALL)
|
||||
if match is None:
|
||||
|
@ -1690,7 +1699,7 @@ try:
|
|||
from tools.split import split_javascript_file
|
||||
split_javascript_file(final, unsuffixed(target), split_js_file)
|
||||
else:
|
||||
if make_source_map: generate_source_map(target)
|
||||
if debug_level >= 2: generate_source_map(target)
|
||||
|
||||
# copy final JS to output
|
||||
shutil.move(final, target)
|
||||
|
|
|
@ -9607,12 +9607,12 @@ def process(filename):
|
|||
src_filename = os.path.join(dirname, 'src.cpp')
|
||||
no_maps_filename = os.path.join(dirname, 'no-maps.out.js')
|
||||
with open(src_filename, 'w') as f: f.write(src)
|
||||
assert '--map' not in Building.COMPILER_TEST_OPTS
|
||||
assert '-g2' not in Building.COMPILER_TEST_OPTS
|
||||
Building.emcc(src_filename, Settings.serialize() + self.emcc_args +
|
||||
Building.COMPILER_TEST_OPTS, no_maps_filename)
|
||||
with open(no_maps_filename) as f: no_maps_file = f.read()
|
||||
out_filename = os.path.join(dirname, 'a.out.js')
|
||||
Building.COMPILER_TEST_OPTS.append('--map')
|
||||
Building.COMPILER_TEST_OPTS.append('-g2')
|
||||
|
||||
def build_and_check():
|
||||
import json
|
||||
|
@ -9656,7 +9656,7 @@ def process(filename):
|
|||
|
||||
def test_exception_source_map(self):
|
||||
if Settings.USE_TYPED_ARRAYS != 2: return self.skip("doesn't pass without typed arrays")
|
||||
if '--map' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('--map')
|
||||
if '-g2' not in Building.COMPILER_TEST_OPTS: Building.COMPILER_TEST_OPTS.append('-g2')
|
||||
|
||||
src = '''
|
||||
#include <stdio.h>
|
||||
|
@ -11821,7 +11821,7 @@ elif 'browser' in str(sys.argv):
|
|||
''')
|
||||
# use relative paths when calling emcc, because file:// URIs can only load
|
||||
# sourceContent when the maps are relative paths
|
||||
Popen([PYTHON, EMCC, 'src.cpp', '-o', 'src.html', '--map'],
|
||||
Popen([PYTHON, EMCC, 'src.cpp', '-o', 'src.html', '-g2'],
|
||||
cwd=self.get_dir()).communicate()
|
||||
webbrowser.open_new('file://' + html_file)
|
||||
print '''
|
||||
|
|
Загрузка…
Ссылка в новой задаче