diff options
Diffstat (limited to 'third_party/python/gyp/test/win/gyptest-link-ordering.py')
-rw-r--r-- | third_party/python/gyp/test/win/gyptest-link-ordering.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/third_party/python/gyp/test/win/gyptest-link-ordering.py b/third_party/python/gyp/test/win/gyptest-link-ordering.py new file mode 100644 index 0000000000..ed8ee98c9e --- /dev/null +++ b/third_party/python/gyp/test/win/gyptest-link-ordering.py @@ -0,0 +1,103 @@ +#!/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() |