#!/usr/bin/env python # Copyright (c) 2013 Google Inc. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ Make sure the link order of object files is the same between msvs and ninja. """ from __future__ import print_function import TestGyp import sys if sys.platform == 'win32': test = TestGyp.TestGyp(formats=['msvs', 'ninja']) CHDIR = 'linker-flags' test.run_gyp('link-ordering.gyp', chdir=CHDIR) test.build('link-ordering.gyp', test.ALL, chdir=CHDIR) def GetDisasm(exe): full_path = test.built_file_path(exe, chdir=CHDIR) # Get disassembly and drop int3 padding between functions. return '\n'.join( x for x in test.run_dumpbin('/disasm', full_path).splitlines() if 'CC' not in x) # This is the full dump that we expect. The source files in the .gyp match # this order which is what determines the ordering in the binary. expected_disasm_basic = ''' _mainCRTStartup: 00401000: B8 05 00 00 00 mov eax,5 00401005: C3 ret ?z@@YAHXZ: 00401010: B8 03 00 00 00 mov eax,3 00401015: C3 ret ?x@@YAHXZ: 00401020: B8 01 00 00 00 mov eax,1 00401025: C3 ret ?y@@YAHXZ: 00401030: B8 02 00 00 00 mov eax,2 00401035: C3 ret _main: 00401040: 33 C0 xor eax,eax 00401042: C3 ret ''' if expected_disasm_basic not in GetDisasm('test_ordering_exe.exe'): print(GetDisasm('test_ordering_exe.exe')) test.fail_test() # Similar to above. The VS generator handles subdirectories differently. expected_disasm_subdirs = ''' _mainCRTStartup: 00401000: B8 05 00 00 00 mov eax,5 00401005: C3 ret _main: 00401010: 33 C0 xor eax,eax 00401012: C3 ret ?y@@YAHXZ: 00401020: B8 02 00 00 00 mov eax,2 00401025: C3 ret ?z@@YAHXZ: 00401030: B8 03 00 00 00 mov eax,3 00401035: C3 ret ''' if expected_disasm_subdirs not in GetDisasm('test_ordering_subdirs.exe'): print(GetDisasm('test_ordering_subdirs.exe')) test.fail_test() # Similar, but with directories mixed into folders (crt and main at the same # level, but with a subdir in the middle). expected_disasm_subdirs_mixed = ''' _mainCRTStartup: 00401000: B8 05 00 00 00 mov eax,5 00401005: C3 ret ?x@@YAHXZ: 00401010: B8 01 00 00 00 mov eax,1 00401015: C3 ret _main: 00401020: 33 C0 xor eax,eax 00401022: C3 ret ?z@@YAHXZ: 00401030: B8 03 00 00 00 mov eax,3 00401035: C3 ret ?y@@YAHXZ: 00401040: B8 02 00 00 00 mov eax,2 00401045: C3 ret ''' if (expected_disasm_subdirs_mixed not in GetDisasm('test_ordering_subdirs_mixed.exe')): print(GetDisasm('test_ordering_subdirs_mixed.exe')) test.fail_test() test.pass_test()