diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-12-27 11:54:14 -0500 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2017-12-27 11:54:14 -0500 |
commit | 86afc6ed8216e7b31ea6ab9c13d7bac470ee0774 (patch) | |
tree | 077892b1abdd090c00bea82fadb9565117311cc7 /buildscripts | |
parent | ef6471345974d763d82b7aa2020f80eb59903b6f (diff) | |
download | mongo-86afc6ed8216e7b31ea6ab9c13d7bac470ee0774.tar.gz |
SERVER-32431 IDL generated code seg faults on s390x
Diffstat (limited to 'buildscripts')
-rw-r--r-- | buildscripts/idl/idl/compiler.py | 11 | ||||
-rw-r--r-- | buildscripts/idl/idl/generator.py | 26 | ||||
-rw-r--r-- | buildscripts/idl/idlc.py | 6 |
3 files changed, 32 insertions, 11 deletions
diff --git a/buildscripts/idl/idl/compiler.py b/buildscripts/idl/idl/compiler.py index 358a19c7958..f8ee921b098 100644 --- a/buildscripts/idl/idl/compiler.py +++ b/buildscripts/idl/idl/compiler.py @@ -23,6 +23,7 @@ from __future__ import absolute_import, print_function, unicode_literals import io import logging import os +import platform from typing import Any, List from . import binder @@ -35,11 +36,14 @@ from . import syntax class CompilerArgs(object): """Set of compiler arguments.""" + # pylint: disable=too-many-instance-attributes + def __init__(self): # type: () -> None """Create a container for compiler arguments.""" self.import_directories = None # type: List[unicode] self.input_file = None # type: unicode + self.target_arch = None # type: unicode self.output_source = None # type: unicode self.output_header = None # type: unicode @@ -176,6 +180,9 @@ def compile_idl(args): source_file_name = args.output_source header_file_name = args.output_header + if args.target_arch is None: + args.target_arch = platform.machine() + # Compile the IDL through the 3 passes with io.open(args.input_file, encoding='utf-8') as file_stream: parsed_doc = parser.parse(file_stream, args.input_file, @@ -191,8 +198,8 @@ def compile_idl(args): bound_doc = binder.bind(parsed_doc.spec) if not bound_doc.errors: - generator.generate_code(bound_doc.spec, args.output_base_dir, header_file_name, - source_file_name) + generator.generate_code(bound_doc.spec, args.target_arch, args.output_base_dir, + header_file_name, source_file_name) return True else: diff --git a/buildscripts/idl/idl/generator.py b/buildscripts/idl/idl/generator.py index 40a81f18aab..fda82ca0d45 100644 --- a/buildscripts/idl/idl/generator.py +++ b/buildscripts/idl/idl/generator.py @@ -720,9 +720,10 @@ class _CppHeaderFileWriter(_CppFileWriterBase): class _CppSourceFileWriter(_CppFileWriterBase): """C++ .cpp File writer.""" - def __init__(self, indented_writer): - # type: (writer.IndentedTextWriter) -> None + def __init__(self, indented_writer, target_arch): + # type: (writer.IndentedTextWriter, unicode) -> None """Create a C++ .cpp file code writer.""" + self._target_arch = target_arch super(_CppSourceFileWriter, self).__init__(indented_writer) def _gen_field_deserializer_expression(self, element_name, field): @@ -815,7 +816,14 @@ class _CppSourceFileWriter(_CppFileWriterBase): with self._predicate(_get_bson_type_check('arrayElement', 'arrayCtxt', field)): array_value = self._gen_field_deserializer_expression('arrayElement', field) - self._writer.write_line('values.emplace_back(%s);' % (array_value)) + + # HACK - SERVER-32431 + # GCC 5.4.0 on s390x has a code gen bug, work around it by not using std::move + if self._target_arch == "s390x": + self._writer.write_line('auto localValue = %s;' % (array_value)) + self._writer.write_line('values.push_back(localValue);') + else: + self._writer.write_line('values.emplace_back(%s);' % (array_value)) with self._block('else {', '}'): self._writer.write_line('arrayCtxt.throwBadArrayFieldNumberValue(arrayFieldName);') @@ -1536,13 +1544,13 @@ def _generate_header(spec, file_name): file_handle.write(stream.getvalue().encode()) -def _generate_source(spec, file_name, header_file_name): - # type: (ast.IDLAST, unicode, unicode) -> None +def _generate_source(spec, target_arch, file_name, header_file_name): + # type: (ast.IDLAST, unicode, unicode, unicode) -> None """Generate a C++ source file.""" stream = io.StringIO() text_writer = writer.IndentedTextWriter(stream) - source = _CppSourceFileWriter(text_writer) + source = _CppSourceFileWriter(text_writer, target_arch) source.generate(spec, header_file_name) @@ -1551,8 +1559,8 @@ def _generate_source(spec, file_name, header_file_name): file_handle.write(stream.getvalue().encode()) -def generate_code(spec, output_base_dir, header_file_name, source_file_name): - # type: (ast.IDLAST, unicode, unicode, unicode) -> None +def generate_code(spec, target_arch, output_base_dir, header_file_name, source_file_name): + # type: (ast.IDLAST, unicode, unicode, unicode, unicode) -> None """Generate a C++ header and source file from an idl.ast tree.""" _generate_header(spec, header_file_name) @@ -1566,4 +1574,4 @@ def generate_code(spec, output_base_dir, header_file_name, source_file_name): # Normalize to POSIX style for consistency across Windows and POSIX. include_h_file_name = include_h_file_name.replace("\\", "/") - _generate_source(spec, source_file_name, include_h_file_name) + _generate_source(spec, target_arch, source_file_name, include_h_file_name) diff --git a/buildscripts/idl/idlc.py b/buildscripts/idl/idlc.py index a9abc0f19cf..c28c57166cf 100644 --- a/buildscripts/idl/idlc.py +++ b/buildscripts/idl/idlc.py @@ -51,6 +51,11 @@ def main(): action='store_true', help='only print out a list of dependent imports') + parser.add_argument( + '--target_arch', + type=str, + help="IDL target archiecture (amd64, s390x). defaults to current machine") + args = parser.parse_args() if args.verbose: @@ -60,6 +65,7 @@ def main(): compiler_args.input_file = args.file compiler_args.import_directories = args.include + compiler_args.target_arch = args.target_arch compiler_args.output_source = args.output compiler_args.output_header = args.header |