Home | History | Annotate | Download | only in win
      1 #!/usr/bin/env python
      2 
      3 # Copyright (c) 2013 Google Inc. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 """
      8 Make sure the link order of object files is the same between msvs and ninja.
      9 """
     10 
     11 import TestGyp
     12 
     13 import sys
     14 
     15 if sys.platform == 'win32':
     16   test = TestGyp.TestGyp(formats=['msvs', 'ninja'])
     17 
     18   CHDIR = 'linker-flags'
     19   test.run_gyp('link-ordering.gyp', chdir=CHDIR)
     20   test.build('link-ordering.gyp', test.ALL, chdir=CHDIR)
     21 
     22   def GetDisasm(exe):
     23     full_path = test.built_file_path(exe, chdir=CHDIR)
     24     # Get disassembly and drop int3 padding between functions.
     25     return '\n'.join(
     26         x for x in test.run_dumpbin('/disasm', full_path).splitlines()
     27                    if 'CC' not in x)
     28 
     29   # This is the full dump that we expect. The source files in the .gyp match
     30   # this order which is what determines the ordering in the binary.
     31 
     32   expected_disasm_basic = '''
     33 _mainCRTStartup:
     34   00401000: B8 05 00 00 00     mov         eax,5
     35   00401005: C3                 ret
     36 ?z@@YAHXZ:
     37   00401010: B8 03 00 00 00     mov         eax,3
     38   00401015: C3                 ret
     39 ?x@@YAHXZ:
     40   00401020: B8 01 00 00 00     mov         eax,1
     41   00401025: C3                 ret
     42 ?y@@YAHXZ:
     43   00401030: B8 02 00 00 00     mov         eax,2
     44   00401035: C3                 ret
     45 _main:
     46   00401040: 33 C0              xor         eax,eax
     47   00401042: C3                 ret
     48 '''
     49 
     50   if expected_disasm_basic not in GetDisasm('test_ordering_exe.exe'):
     51     print GetDisasm('test_ordering_exe.exe')
     52     test.fail_test()
     53 
     54   # Similar to above. The VS generator handles subdirectories differently.
     55 
     56   expected_disasm_subdirs = '''
     57 _mainCRTStartup:
     58   00401000: B8 05 00 00 00     mov         eax,5
     59   00401005: C3                 ret
     60 _main:
     61   00401010: 33 C0              xor         eax,eax
     62   00401012: C3                 ret
     63 ?y@@YAHXZ:
     64   00401020: B8 02 00 00 00     mov         eax,2
     65   00401025: C3                 ret
     66 ?z@@YAHXZ:
     67   00401030: B8 03 00 00 00     mov         eax,3
     68   00401035: C3                 ret
     69 '''
     70 
     71   if expected_disasm_subdirs not in GetDisasm('test_ordering_subdirs.exe'):
     72     print GetDisasm('test_ordering_subdirs.exe')
     73     test.fail_test()
     74 
     75   # Similar, but with directories mixed into folders (crt and main at the same
     76   # level, but with a subdir in the middle).
     77 
     78   expected_disasm_subdirs_mixed = '''
     79 _mainCRTStartup:
     80   00401000: B8 05 00 00 00     mov         eax,5
     81   00401005: C3                 ret
     82 ?x@@YAHXZ:
     83   00401010: B8 01 00 00 00     mov         eax,1
     84   00401015: C3                 ret
     85 _main:
     86   00401020: 33 C0              xor         eax,eax
     87   00401022: C3                 ret
     88 ?z@@YAHXZ:
     89   00401030: B8 03 00 00 00     mov         eax,3
     90   00401035: C3                 ret
     91 ?y@@YAHXZ:
     92   00401040: B8 02 00 00 00     mov         eax,2
     93   00401045: C3                 ret
     94 '''
     95 
     96   if (expected_disasm_subdirs_mixed not in
     97       GetDisasm('test_ordering_subdirs_mixed.exe')):
     98     print GetDisasm('test_ordering_subdirs_mixed.exe')
     99     test.fail_test()
    100 
    101   test.pass_test()
    102