Hi echristo,

Unlike most of the other platforms supported by Clang, CloudABI only supports 
static linkage, for the reason that global filesystem access is prohibited. 
Functions provided by `dlfcn.h` are not present. As we know that applications 
will not try to do any symbol lookups at run-time, we can garbage collect 
unused code quite aggressively. Because of this, it makes sense to enable 
-ffunction-sections and -fdata-sections by default.

Object files will be a bit larger than usual, but the resulting binary will not 
be affected, as the sections are merged again. However, when --gc-sections is 
used, the linker is able to remove unused code far more more aggressively. It 
also has the advantage that transitive library dependencies only need to be 
provided to the linker in case that functionality is actually used.

REPOSITORY
  rL LLVM

http://reviews.llvm.org/D8635

Files:
  lib/Driver/Tools.cpp
  test/Driver/cloudabi.c
  test/Driver/cloudabi.cpp

Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -3318,13 +3318,18 @@
     CmdArgs.push_back("-generate-type-units");
   }
 
+  // CloudABI only supports static linkage. Simplify the library
+  // dependency tree and reduce binary size by using -ffunction-sections
+  // and -fdata-sections by default.
+  bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
+
   if (Args.hasFlag(options::OPT_ffunction_sections,
-                   options::OPT_fno_function_sections, false)) {
+                   options::OPT_fno_function_sections, UseSeparateSections)) {
     CmdArgs.push_back("-ffunction-sections");
   }
 
   if (Args.hasFlag(options::OPT_fdata_sections,
-                   options::OPT_fno_data_sections, false)) {
+                   options::OPT_fno_data_sections, UseSeparateSections)) {
     CmdArgs.push_back("-fdata-sections");
   }
 
Index: test/Driver/cloudabi.c
===================================================================
--- test/Driver/cloudabi.c
+++ test/Driver/cloudabi.c
@@ -1,3 +1,3 @@
 // RUN: %clang %s -### -target x86_64-unknown-cloudabi 2>&1 | FileCheck %s
-// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi"
+// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi" {{.*}} 
"-ffunction-sections" "-fdata-sections"
 // CHECK: "-Bstatic" "--eh-frame-hdr" "--gc-sections" "-o" "a.out" "crt0.o" 
"crtbegin.o" "{{.*}}" "{{.*}}" "-lc" "-lcompiler_rt" "crtend.o"
Index: test/Driver/cloudabi.cpp
===================================================================
--- test/Driver/cloudabi.cpp
+++ test/Driver/cloudabi.cpp
@@ -1,3 +1,3 @@
 // RUN: %clangxx %s -### -target x86_64-unknown-cloudabi 2>&1 | FileCheck %s
-// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi"
+// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi" {{.*}} 
"-ffunction-sections" "-fdata-sections"
 // CHECK: "-Bstatic" "--eh-frame-hdr" "--gc-sections" "-o" "a.out" "crt0.o" 
"crtbegin.o" "{{.*}}" "{{.*}}" "-lc++" "-lc++abi" "-lunwind" "-lc" 
"-lcompiler_rt" "crtend.o"

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -3318,13 +3318,18 @@
     CmdArgs.push_back("-generate-type-units");
   }
 
+  // CloudABI only supports static linkage. Simplify the library
+  // dependency tree and reduce binary size by using -ffunction-sections
+  // and -fdata-sections by default.
+  bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
+
   if (Args.hasFlag(options::OPT_ffunction_sections,
-                   options::OPT_fno_function_sections, false)) {
+                   options::OPT_fno_function_sections, UseSeparateSections)) {
     CmdArgs.push_back("-ffunction-sections");
   }
 
   if (Args.hasFlag(options::OPT_fdata_sections,
-                   options::OPT_fno_data_sections, false)) {
+                   options::OPT_fno_data_sections, UseSeparateSections)) {
     CmdArgs.push_back("-fdata-sections");
   }
 
Index: test/Driver/cloudabi.c
===================================================================
--- test/Driver/cloudabi.c
+++ test/Driver/cloudabi.c
@@ -1,3 +1,3 @@
 // RUN: %clang %s -### -target x86_64-unknown-cloudabi 2>&1 | FileCheck %s
-// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi"
+// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi" {{.*}} "-ffunction-sections" "-fdata-sections"
 // CHECK: "-Bstatic" "--eh-frame-hdr" "--gc-sections" "-o" "a.out" "crt0.o" "crtbegin.o" "{{.*}}" "{{.*}}" "-lc" "-lcompiler_rt" "crtend.o"
Index: test/Driver/cloudabi.cpp
===================================================================
--- test/Driver/cloudabi.cpp
+++ test/Driver/cloudabi.cpp
@@ -1,3 +1,3 @@
 // RUN: %clangxx %s -### -target x86_64-unknown-cloudabi 2>&1 | FileCheck %s
-// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi"
+// CHECK: "-cc1" "-triple" "x86_64-unknown-cloudabi" {{.*}} "-ffunction-sections" "-fdata-sections"
 // CHECK: "-Bstatic" "--eh-frame-hdr" "--gc-sections" "-o" "a.out" "crt0.o" "crtbegin.o" "{{.*}}" "{{.*}}" "-lc++" "-lc++abi" "-lunwind" "-lc" "-lcompiler_rt" "crtend.o"
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to