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