[Lldb-commits] [lldb] r348918 - build.py: Implement "gcc" builder

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Wed Dec 12 00:54:14 PST 2018


Author: labath
Date: Wed Dec 12 00:54:14 2018
New Revision: 348918

URL: http://llvm.org/viewvc/llvm-project?rev=348918&view=rev
Log:
build.py: Implement "gcc" builder

Summary:
This implements the gcc builder in build.py script to allow it to
compile host executables when running on a non-windows host. Where it
made sense, I tried to share code with the msvc builder by moving stuff
to the base class.

Reviewers: zturner

Subscribers: mehdi_amini, dexonsmith, lldb-commits

Differential Revision: https://reviews.llvm.org/D55430

Added:
    lldb/trunk/lit/BuildScript/toolchain-clang.test
Modified:
    lldb/trunk/lit/Breakpoint/case-sensitive.test
    lldb/trunk/lit/BuildScript/modes.test
    lldb/trunk/lit/BuildScript/script-args.test
    lldb/trunk/lit/helper/build.py   (contents, props changed)

Modified: lldb/trunk/lit/Breakpoint/case-sensitive.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/Breakpoint/case-sensitive.test?rev=348918&r1=348917&r2=348918&view=diff
==============================================================================
--- lldb/trunk/lit/Breakpoint/case-sensitive.test (original)
+++ lldb/trunk/lit/Breakpoint/case-sensitive.test Wed Dec 12 00:54:14 2018
@@ -1,6 +1,6 @@
 # REQUIRES: nowindows
 #
-# RUN: %clang %p/Inputs/case-sensitive.c -g -o %t
+# RUN: %build %p/Inputs/case-sensitive.c --nodefaultlib -o %t
 # RUN: lldb-test breakpoints %t %s | FileCheck %s
 
 breakpoint set -f case-sensitive.c -l 3

Modified: lldb/trunk/lit/BuildScript/modes.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/BuildScript/modes.test?rev=348918&r1=348917&r2=348918&view=diff
==============================================================================
--- lldb/trunk/lit/BuildScript/modes.test (original)
+++ lldb/trunk/lit/BuildScript/modes.test Wed Dec 12 00:54:14 2018
@@ -1,5 +1,3 @@
-REQUIRES: system-windows
-
 RUN: %build -n --verbose --arch=32 --mode=compile --compiler=any -o %t/foo.out foobar.c \
 RUN:    | FileCheck --check-prefix=COMPILE %s
 
@@ -21,17 +19,17 @@ RUN:    | FileCheck --check-prefix=BOTH-
 
 COMPILE: compiling foobar.c -> foo.out
 
-COMPILE-MULTI: compiling foo.c -> foo.obj
-COMPILE-MULTI: compiling bar.c -> bar.obj
+COMPILE-MULTI: compiling foo.c -> foo.o{{(bj)?}}
+COMPILE-MULTI: compiling bar.c -> bar.o{{(bj)?}}
 
 
 LINK: linking foobar.obj -> foo.exe
 
 LINK-MULTI: linking foo.obj+bar.obj -> foobar.exe
 
-BOTH: compiling foobar.c -> foobar.exe-foobar.obj
-BOTH: linking foobar.exe-foobar.obj -> foobar.exe
+BOTH: compiling foobar.c -> [[OBJFOO:foobar.exe-foobar.o(bj)?]]
+BOTH: linking [[OBJFOO]] -> foobar.exe
 
-BOTH-MULTI: compiling foo.c -> foobar.exe-foo.obj
-BOTH-MULTI: compiling bar.c -> foobar.exe-bar.obj
-BOTH-MULTI: linking foobar.exe-foo.obj+foobar.exe-bar.obj -> foobar.exe
+BOTH-MULTI: compiling foo.c -> [[OBJFOO:foobar.exe-foo.o(bj)?]]
+BOTH-MULTI: compiling bar.c -> [[OBJBAR:foobar.exe-bar.o(bj)?]]
+BOTH-MULTI: linking [[OBJFOO]]+[[OBJBAR]] -> foobar.exe

Modified: lldb/trunk/lit/BuildScript/script-args.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/BuildScript/script-args.test?rev=348918&r1=348917&r2=348918&view=diff
==============================================================================
--- lldb/trunk/lit/BuildScript/script-args.test (original)
+++ lldb/trunk/lit/BuildScript/script-args.test Wed Dec 12 00:54:14 2018
@@ -1,5 +1,3 @@
-REQUIRES: system-windows
-
 RUN: %build -n --verbose --arch=32 --mode=compile --compiler=any -o %t/foo.out foobar.c \
 RUN:    | FileCheck %s
 RUN: %build -n --verbose --arch=32 --mode=compile --compiler=any --outdir %t foo.c bar.c \
@@ -31,4 +29,4 @@ MULTI-INPUT-NEXT:   Clean: True
 MULTI-INPUT-NEXT:   Verbose: True
 MULTI-INPUT-NEXT:   Dryrun: True
 MULTI-INPUT-NEXT:   Inputs: foo.c
-MULTI-INPUT-NEXT:           bar.c
\ No newline at end of file
+MULTI-INPUT-NEXT:           bar.c

Added: lldb/trunk/lit/BuildScript/toolchain-clang.test
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/BuildScript/toolchain-clang.test?rev=348918&view=auto
==============================================================================
--- lldb/trunk/lit/BuildScript/toolchain-clang.test (added)
+++ lldb/trunk/lit/BuildScript/toolchain-clang.test Wed Dec 12 00:54:14 2018
@@ -0,0 +1,14 @@
+RUN: %build -n --verbose --arch=32 --compiler=clang --mode=compile-and-link -o %t/foo.exe foobar.c \
+RUN:    | FileCheck --check-prefix=CHECK --check-prefix=CHECK-32 %s
+
+RUN: %build -n --verbose --arch=64 --compiler=clang --mode=compile-and-link -o %t/foo.exe foobar.c \
+RUN:    | FileCheck --check-prefix=CHECK --check-prefix=CHECK-64 %s
+
+CHECK: Cleaning {{.*}}toolchain-clang.test.tmp{{.}}foo.exe-foobar.o
+CHECK: Cleaning {{.*}}toolchain-clang.test.tmp{{.}}foo.exe
+CHECK: compiling foobar.c -> foo.exe-foobar.o
+CHECK-32: {{.*}}clang++{{(.exe)?}} -m32 -g -O0 -c -o {{.*}}foo.exe-foobar.o {{.*}}foobar.c
+CHECK-64: {{.*}}clang++{{(.exe)?}} -m64 -g -O0 -c -o {{.*}}foo.exe-foobar.o {{.*}}foobar.c
+CHECK: linking foo.exe-foobar.o -> foo.exe
+CHECK-32: {{.*}}clang++{{(.exe)?}} -m32 -o {{.*}}foo.exe {{.*}}foo.exe-foobar.o
+CHECK-64: {{.*}}clang++{{(.exe)?}} -m64 -o {{.*}}foo.exe {{.*}}foo.exe-foobar.o

Modified: lldb/trunk/lit/helper/build.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/helper/build.py?rev=348918&r1=348917&r2=348918&view=diff
==============================================================================
--- lldb/trunk/lit/helper/build.py (original)
+++ lldb/trunk/lit/helper/build.py Wed Dec 12 00:54:14 2018
@@ -1,3 +1,5 @@
+#! /usr/bin/env python
+
 from __future__ import print_function
 
 import argparse
@@ -207,7 +209,7 @@ def find_toolchain(compiler, tools_dir):
     return 'unknown'
 
 class Builder(object):
-    def __init__(self, toolchain_type, args):
+    def __init__(self, toolchain_type, args, obj_ext):
         self.toolchain_type = toolchain_type
         self.inputs = args.inputs
         self.arch = args.arch
@@ -219,10 +221,50 @@ class Builder(object):
         self.mode = args.mode
         self.nodefaultlib = args.nodefaultlib
         self.verbose = args.verbose
+        self.obj_ext = obj_ext
+
+    def _exe_file_name(self):
+        assert self.mode != 'compile'
+        return self.output
+
+    def _output_name(self, input, extension, with_executable=False):
+        basename = os.path.splitext(os.path.basename(input))[0] + extension
+        if with_executable:
+            exe_basename = os.path.basename(self._exe_file_name())
+            basename = exe_basename + '-' + basename
+
+        output = os.path.join(self.outdir, basename)
+        return os.path.normpath(output)
+
+    def _obj_file_names(self):
+        if self.mode == 'link':
+            return self.inputs
+
+        if self.mode == 'compile-and-link':
+            # Object file names should factor in both the input file (source)
+            # name and output file (executable) name, to ensure that two tests
+            # which share a common source file don't race to write the same
+            # object file.
+            return [self._output_name(x, self.obj_ext, True) for x in self.inputs]
+
+        if self.mode == 'compile' and self.output:
+            return [self.output]
+
+        return [self._output_name(x, self.obj_ext) for x in self.inputs]
+
+    def build_commands(self):
+        commands = []
+        if self.mode == 'compile' or self.mode == 'compile-and-link':
+            for input, output in zip(self.inputs, self._obj_file_names()):
+                commands.append(self._get_compilation_command(input, output))
+        if self.mode == 'link' or self.mode == 'compile-and-link':
+            commands.append(self._get_link_command())
+        return commands
+
 
 class MsvcBuilder(Builder):
     def __init__(self, toolchain_type, args):
-        Builder.__init__(self, toolchain_type, args)
+        Builder.__init__(self, toolchain_type, args, '.obj')
 
         self.msvc_arch_str = 'x86' if self.arch == '32' else 'x64'
 
@@ -486,47 +528,17 @@ class MsvcBuilder(Builder):
             linkenv.update(defaultenv)
         return (compileenv, linkenv)
 
-    def _output_name(self, input, extension, with_executable=False):
-        basename = os.path.splitext(os.path.basename(input))[0] + extension
-        if with_executable:
-            exe_basename = os.path.basename(self._exe_file_name())
-            basename = exe_basename + '-' + basename
-
-        output = os.path.join(self.outdir, basename)
-        return os.path.normpath(output)
-
     def _ilk_file_names(self):
         if self.mode == 'link':
             return []
 
         return [self._output_name(x, '.ilk') for x in self.inputs]
 
-    def _obj_file_names(self):
-        if self.mode == 'link':
-            return self.inputs
-
-        if self.mode == 'compile-and-link':
-            # Object file names should factor in both the input file (source)
-            # name and output file (executable) name, to ensure that two tests
-            # which share a common source file don't race to write the same
-            # object file.
-            return [self._output_name(x, '.obj', True) for x in self.inputs]
-
-        if self.mode == 'compile' and self.output:
-            return [self.output]
-
-        return [self._output_name(x, '.obj') for x in self.inputs]
-
     def _pdb_file_name(self):
         if self.mode == 'compile':
             return None
         return os.path.splitext(self.output)[0] + '.pdb'
 
-    def _exe_file_name(self):
-        if self.mode == 'compile':
-            return None
-        return self.output
-
     def _get_compilation_command(self, source, obj):
         args = []
 
@@ -586,10 +598,6 @@ class MsvcBuilder(Builder):
         return commands
 
     def output_files(self):
-        outdir = os.path.dirname(self.output)
-        file = os.path.basename(self.output)
-        name, ext = os.path.splitext(file)
-
         outputs = []
         if self.mode == 'compile' or self.mode == 'compile-and-link':
             outputs.extend(self._ilk_file_names())
@@ -602,13 +610,56 @@ class MsvcBuilder(Builder):
 
 class GccBuilder(Builder):
     def __init__(self, toolchain_type, args):
-        Builder.__init__(self, toolchain_type, args)
+        Builder.__init__(self, toolchain_type, args, '.o')
+
+    def _get_compilation_command(self, source, obj):
+        args = []
+
+        args.append(self.compiler)
+        args.append('-m' + self.arch)
+
+        args.append('-g')
+        if self.opt == 'none':
+            args.append('-O0')
+        elif self.opt == 'basic':
+            args.append('-O2')
+        elif self.opt == 'lto':
+            args.append('-flto=thin')
+        if self.nodefaultlib:
+            args.append('-nostdinc')
+            args.append('-static')
+        args.append('-c')
+
+        args.extend(['-o', obj])
+        args.append(source)
+
+        return ('compiling', [source], obj, {}, args)
+
+    def _get_link_command(self):
+        args = []
+        args.append(self.compiler)
+        args.append('-m' + self.arch)
+        if self.nodefaultlib:
+            args.append('-nostdlib')
+            args.append('-static')
+            main_symbol = 'main'
+            if sys.platform == 'darwin':
+                main_symbol = '_main'
+            args.append('-Wl,-e,' + main_symbol)
+        args.extend(['-o', self._exe_file_name()])
+        args.extend(self._obj_file_names())
+
+        return ('linking', self._obj_file_names(), self._exe_file_name(), {}, args)
 
-    def build_commands(self):
-        pass
 
     def output_files(self):
-        pass
+        outputs = []
+        if self.mode == 'compile' or self.mode == 'compile-and-link':
+            outputs.extend(self._obj_file_names())
+        if self.mode == 'link' or self.mode == 'compile-and-link':
+            outputs.append(self._exe_file_name())
+
+        return outputs
 
 def indent(text, spaces):
     def prefixed_lines():

Propchange: lldb/trunk/lit/helper/build.py
------------------------------------------------------------------------------
    svn:executable = *




More information about the lldb-commits mailing list