summaryrefslogtreecommitdiff
path: root/buildscripts
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2017-12-27 11:54:14 -0500
committerMark Benvenuto <mark.benvenuto@mongodb.com>2017-12-27 11:54:14 -0500
commit86afc6ed8216e7b31ea6ab9c13d7bac470ee0774 (patch)
tree077892b1abdd090c00bea82fadb9565117311cc7 /buildscripts
parentef6471345974d763d82b7aa2020f80eb59903b6f (diff)
downloadmongo-86afc6ed8216e7b31ea6ab9c13d7bac470ee0774.tar.gz
SERVER-32431 IDL generated code seg faults on s390x
Diffstat (limited to 'buildscripts')
-rw-r--r--buildscripts/idl/idl/compiler.py11
-rw-r--r--buildscripts/idl/idl/generator.py26
-rw-r--r--buildscripts/idl/idlc.py6
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