Просмотр исходного кода

build: add basic clang/LLVM toolchain support

- Honor UCLIBC_EXTRA_LDFLAGS in LDFLAGS and in cmd_compile.u.
- Pass -Wl,--hash-style=both when LLD is detected, since LLD does not
  emit DT_HASH by default.
- Use libclang_rt.builtins.a as LIBGCC_A when the compiler is clang.
Waldemar Brodkorb 15 часов назад
Родитель
Сommit
5135c7303d
2 измененных файлов с 16 добавлено и 1 удалено
  1. 1 1
      Makerules
  2. 15 0
      Rules.mak

+ 1 - 1
Makerules

@@ -268,7 +268,7 @@ cmd_compile.c = $(CC) -c $< -o $@ \
 	$(CFLAGS_gen.dep)
 cmd_compile.i = $(cmd_compile.c:-c=-E -dD) $(UCLIBC_EXTRA_CPPFLAGS)
 cmd_compile.s = $(cmd_compile.c:-c=-S)
-cmd_compile.u = $(CC) $^ $(DEPS-$(notdir $@)) -o $@ $(CFLAGS) $(CFLAGS-$(notdir $(^D))) $(CFLAGS-$(notdir $@)) $(CFLAGS_gen.dep)
+cmd_compile.u = $(CC) $^ $(DEPS-$(notdir $@)) -o $@ $(CFLAGS) $(CFLAGS-$(notdir $(^D))) $(CFLAGS-$(notdir $@)) $(CFLAGS_gen.dep) $(UCLIBC_EXTRA_LDFLAGS)
 cmd_compile.S = $(filter-out -std=%, $(cmd_compile.c)) -D__ASSEMBLER__ $(ASFLAGS) $(ARCH_ASFLAGS) $(ASFLAGS-$(suffix $@)) $(ASFLAGS-$(notdir $<)) $(ASFLAGS-$(notdir $@))
 cmd_compile.m = $(cmd_compile.c) -DL_$(patsubst %$(suffix $(notdir $@)),%,$(notdir $@))
 cmd_compile.mi= $(cmd_compile.m:-c=-E -dD) $(UCLIBC_EXTRA_CPPFLAGS)

+ 15 - 0
Rules.mak

@@ -635,6 +635,12 @@ ifeq ($(UCLIBC_BUILD_NOW),y)
 LDFLAGS_NOSTRIP+=-Wl,-z,now
 endif
 
+# llvm lld does not emit traditional SysV DT_HASH table for symbol lookup
+LD_IS_LLD:=$(shell $(CC) $(CFLAGS) -fuse-ld=lld -Wl,--version 2>&1 | grep -q '^LLD' && echo y)
+ifeq ($(LD_IS_LLD),y)
+LDFLAGS_NOSTRIP+=-Wl,--hash-style=both
+endif
+
 ifeq ($(LDSO_GNU_HASH_SUPPORT),y)
 # Be sure that binutils support it
 $(eval $(call check-ld-var,--hash-style=gnu))
@@ -657,6 +663,10 @@ $(eval $(call check-ld-var,-O2))
 LDFLAGS_NOSTRIP += $(CFLAG_-Wl-O2)
 endif
 
+ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS)),"")
+LDFLAGS_NOSTRIP += $(call qstrip,$(UCLIBC_EXTRA_LDFLAGS))
+endif
+
 LDFLAGS:=$(LDFLAGS_NOSTRIP) -Wl,-z,defs
 
 ifeq ($(DOSTRIP),y)
@@ -769,6 +779,11 @@ ASFLAGS += $(ASFLAG_--noexecstack)
 LIBGCC_CFLAGS ?= $(CFLAGS) $(CPU_CFLAGS-y)
 $(eval $(call cache-output-var,LIBGCC_A,$(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name))
 $(eval $(call cache-output-var,LIBGCC_EH,$(CC) $(LIBGCC_CFLAGS) -print-file-name=libgcc_eh.a))
+
+ifeq ($(shell $(CC) --version 2>/dev/null | grep -c 'clang'),1)
+LIBGCC_A := $(shell $(CC) $(LIBGCC_CFLAGS) -print-file-name=libclang_rt.builtins.a)
+endif
+
 # with -O0 we (e.g. lockf) might end up with references to
 # _Unwind_Resume, so pull in gcc_eh in this case..
 # with a --disable-shared toolchain, libgcc_eh.a and libgcc.a are combined