X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fnative_client%2Fpnacl%2Fdriver%2Fldtools.py;h=b84937e57347201290b19ed6e310a16b35d5109e;hb=4a1a0bdd01eef90b0826a0e761d3379d3715c10f;hp=9449d84bbc93c1e78419252dcd8a0fefb2cbaaa3;hpb=b1be5ca53587d23e7aeb77b26861fdc0a181ffd8;p=platform%2Fframework%2Fweb%2Fcrosswalk.git diff --git a/src/native_client/pnacl/driver/ldtools.py b/src/native_client/pnacl/driver/ldtools.py index 9449d84..b84937e 100755 --- a/src/native_client/pnacl/driver/ldtools.py +++ b/src/native_client/pnacl/driver/ldtools.py @@ -2,31 +2,15 @@ # Copyright (c) 2012 The Native Client Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# -# IMPORTANT NOTE: If you make local mods to this file, you must run: -# % pnacl/build.sh driver -# in order for them to take effect in the scons build. This command -# updates the copy in the toolchain/ tree. -# -# Tool for reading linker scripts and searching for libraries. -# There is still a circular dependence on filetype.IsNative/IsBitcode -# (filetype uses IsLinkerScript from here) -# TODO(dschuff): fix. +# Tool for searching for libraries. -import os import driver_log import filetype import pathtools -def IsLinkerScript(filename): - _, ext = os.path.splitext(filename) - return (len(ext) > 0 and ext[1:] in ('o', 'so', 'a', 'po', 'pa', 'x') and - ParseLinkerScript(filename) is not None) - - class LibraryTypes(object): """ An enum indicating the type of library that can be searched for. """ BITCODE = 1 @@ -34,139 +18,12 @@ class LibraryTypes(object): ANY = 3 -# Parses a linker script to determine additional ld arguments specified. -# Returns a list of linker arguments. -# -# For example, if the linker script contains -# -# GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.2 ) ) -# -# Then this function will return: -# -# ['--start-group', '-l:libc.so.6', '-l:libc_nonshared.a', -# '--as-needed', '-l:ld-linux.so.2', '--no-as-needed', '--end-group'] -# -# Returns None on any parse error. -def ParseLinkerScript(filename): - fp = driver_log.DriverOpen(filename, 'r') - - ret = [] - stack = [] - expect = '' # Expected next token - while True: - token = GetNextToken(fp) - if token is None: - # Tokenization error - return None - - if not token: - # EOF - break - - if expect: - if token == expect: - expect = '' - continue - else: - return None - - if not stack: - if token == 'INPUT': - expect = '(' - stack.append(token) - elif token == 'GROUP': - expect = '(' - ret.append('--start-group') - stack.append(token) - elif token == 'OUTPUT_FORMAT': - expect = '(' - stack.append(token) - elif token == 'EXTERN': - expect = '(' - stack.append(token) - elif token == ';': - pass - else: - return None - else: - if token == ')': - section = stack.pop() - if section == 'AS_NEEDED': - ret.append('--no-as-needed') - elif section == 'GROUP': - ret.append('--end-group') - elif token == 'AS_NEEDED': - expect = '(' - ret.append('--as-needed') - stack.append('AS_NEEDED') - elif stack[-1] == 'OUTPUT_FORMAT': - # Ignore stuff inside OUTPUT_FORMAT - pass - elif stack[-1] == 'EXTERN': - ret.append('--undefined=' + token) - else: - ret.append('-l:' + token) - - fp.close() - return ret - - -# Get the next token from the linker script -# Returns: '' for EOF. -# None on error. -def GetNextToken(fp): - token = '' - while True: - ch = fp.read(1) - - if not ch: - break - - # Whitespace terminates a token - # (but ignore whitespace before the token) - if ch in (' ', '\t', '\n'): - if token: - break - else: - continue - - # ( and ) are tokens themselves (or terminate existing tokens) - if ch in ('(',')'): - if token: - fp.seek(-1, os.SEEK_CUR) - break - else: - token = ch - break - - token += ch - if token.endswith('/*'): - if not ReadPastComment(fp, '*/'): - return None - token = token[:-2] - - return token - -def ReadPastComment(fp, terminator): - s = '' - while True: - ch = fp.read(1) - if not ch: - return False - s += ch - if s.endswith(terminator): - break - - return True - -############################################################################## - def FindFirstLinkerScriptInput(inputs): for i in xrange(len(inputs)): f = inputs[i] if IsFlag(f): continue - if IsLinkerScript(f): + if filetype.IsLinkerScript(f): return (i, f) return (None, None) @@ -179,7 +36,7 @@ def ExpandLinkerScripts(inputs, searchdirs, static_only): if path is None: break - new_inputs = ParseLinkerScript(path) + new_inputs = filetype.ParseLinkerScript(path) ExpandLibFlags(new_inputs, searchdirs, static_only, LibraryTypes.ANY) inputs = inputs[:i] + new_inputs + inputs[i+1:] @@ -263,7 +120,7 @@ def FindFile(search_names, search_dirs, acceptable_types): if acceptable_types == LibraryTypes.ANY: return path # Linker scripts aren't classified as Native or Bitcode. - if IsLinkerScript(path): + if filetype.IsLinkerScript(path): return path if (acceptable_types == LibraryTypes.NATIVE and filetype.IsNative(path)):