[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v2 3/3] arch/*, build: Add support for clang compilation
In order to perform the compilation and linking with clang without warnings, the following flags must be removed: -fno-tree-sra, -fms-extensions, -nostdinc, -fno-reorder-blocks, -mno-fp-ret-in-387. Functions such as have_clang, have_gcc, clang_version_ge, error_if_clang_version_lt have been added to solve the problem. With all of this we are able to rearrange the flags. So, if there are flags that fail with clang, we can select them only for GCC compilation. Also, we can introduce specific flags for clang. Signed-off-by: Alice Suiu <alicesuiu17@xxxxxxxxx> --- Makefile | 2 +- Makefile.uk | 24 ++++++++++-------------- arch/x86/x86_64/Makefile.uk | 20 ++++++++------------ support/build/Makefile.rules | 25 ++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/Makefile b/Makefile index d70b3fc..a98d34c 100644 --- a/Makefile +++ b/Makefile @@ -506,7 +506,7 @@ ifeq ("$(origin COMPILER)", "command line") CONFIG_COMPILER := $(COMPILER) endif ifndef CONFIG_COMPILER - CONFIG_COMPILER = gcc + CONFIG_COMPILER := gcc endif $(eval $(call verbose_include,$(CONFIG_UK_BASE)/arch/$(UK_FAMILY)/Compiler.uk)) diff --git a/Makefile.uk b/Makefile.uk index dee9f35..e44f1fa 100644 --- a/Makefile.uk +++ b/Makefile.uk @@ -4,14 +4,16 @@ # ################################################################################ -COMPFLAGS += -nostdinc -nostdlib +COMPFLAGS += -nostdlib +COMPFLAGS-$(call have_gcc) += -nostdinc COMPFLAGS += -U __linux__ -U __FreeBSD__ -U __sun__ -COMPFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-tree-sra +COMPFLAGS += -fno-stack-protector -fno-omit-frame-pointer +COMPFLAGS-$(call have_gcc) += -fno-tree-sra COMPFLAGS += -Wall -Wextra # TODO: Remove -fms-extensions if not needed for our code (it was moved from Arm64 arch) -CFLAGS += -fms-extensions -ASFLAGS += -D__ASSEMBLY__ +CFLAGS-$(call have_gcc) += -fms-extensions +ASFLAGS += -D__ASSEMBLY__ ASINCLUDES += -I$(CONFIG_UK_BASE)/include CINCLUDES += -I$(CONFIG_UK_BASE)/include @@ -21,8 +23,10 @@ GOCINCLUDES += -I$(CONFIG_UK_BASE)/include # Set the text and data sections to be readable and writable. Also, # do not page-align the data segment. If the output format supports # Unix style magic numbers, mark the output as OMAGIC. -LIBLDFLAGS += -nostdinc -nostdlib -Wl,--omagic -Wl,-r -Wl,-d -Wl,--build-id=none -LDFLAGS += -nostdinc -nostdlib -Wl,--omagic -Wl,--build-id=none +LIBLDFLAGS += -nostdlib -Wl,--omagic -Wl,-r -Wl,-d -Wl,--build-id=none +LIBLDFLAGS-$(call have_gcc) += -nostdinc +LDFLAGS += -nostdlib -Wl,--omagic -Wl,--build-id=none +LDFLAGS-$(call have_gcc) += -nostdinc COMPFLAGS-$(CONFIG_OPTIMIZE_NONE) += -O0 -fno-optimize-sibling-calls -fno-tree-vectorize COMPFLAGS-$(CONFIG_OPTIMIZE_SIZE) += -Os @@ -55,11 +59,3 @@ M4FLAGS += -DUK_VERSION=$(UK_VERSION).$(UK_SUBVERSION) COMPFLAGS-$(call gcc_version_ge,6,1) += -no-pie LIBLDFLAGS-$(call gcc_version_ge,6,1) += -no-pie LDFLAGS-$(call gcc_version_ge,6,1) += -no-pie - -ifeq ($(CONFIG_COMPILER), clang) -CFLAGS:=$(filter-out -fms-extensions,$(CFLAGS)) -COMPFLAGS:=$(filter-out -fno-tree-sra,$(COMPFLAGS)) -COMPFLAGS:=$(filter-out -nostdinc,$(COMPFLAGS)) -LIBLDFLAGS:=$(filter-out -nostdinc,$(LIBLDFLAGS)) -LDFLAGS:=$(filter-out -nostdinc,$(LDFLAGS)) -endif \ No newline at end of file diff --git a/arch/x86/x86_64/Makefile.uk b/arch/x86/x86_64/Makefile.uk index 1bbe02c..ea1c817 100644 --- a/arch/x86/x86_64/Makefile.uk +++ b/arch/x86/x86_64/Makefile.uk @@ -1,7 +1,9 @@ -ARCHFLAGS += -D__X86_64__ -ARCHFLAGS += -m64 -mno-red-zone -fno-reorder-blocks -fno-asynchronous-unwind-tables -ISR_ARCHFLAGS += -D__X86_64__ -ISR_ARCHFLAGS += -m64 -mno-red-zone -fno-reorder-blocks -fno-asynchronous-unwind-tables +ARCHFLAGS += -D__X86_64__ +ARCHFLAGS += -m64 -mno-red-zone -fno-asynchronous-unwind-tables +ARCHFLAGS-$(call have_gcc) += -fno-reorder-blocks +ISR_ARCHFLAGS += -D__X86_64__ +ISR_ARCHFLAGS += -m64 -mno-red-zone -fno-asynchronous-unwind-tables +ISR_ARCHFLAGS-$(call have_gcc) += -fno-reorder-blocks CINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include ASINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include @@ -9,7 +11,8 @@ CXXINCLUDES += -I$(CONFIG_UK_BASE)/arch/x86/x86_64/include # compiler flags to prevent use of extended (FP, SSE, AVX) registers. # This is for files that contain trap/exception/interrupt handlers -ISR_ARCHFLAGS += -mno-80387 -mno-fp-ret-in-387 -mno-mmx -mno-sse -mno-avx -mgeneral-regs-only +ISR_ARCHFLAGS += -mno-80387 -mno-mmx -mno-sse -mno-avx -mgeneral-regs-only +ISR_ARCHFLAGS-$(call have_gcc) += -mno-fp-ret-in-387 ARCHFLAGS-$(CONFIG_MARCH_X86_64_GENERIC) += -mtune=generic ISR_ARCHFLAGS-$(CONFIG_MARCH_X86_64_GENERIC) += -mtune=generic @@ -41,10 +44,3 @@ ARCHFLAGS-$(CONFIG_MARCH_X86_64_BTVER1) += -march=btver1 ISR_ARCHFLAGS-$(CONFIG_MARCH_X86_64_BTVER1) += -march=btver1 ARCHFLAGS-$(CONFIG_MARCH_X86_64_BTVER2) += -march=btver2 ISR_ARCHFLAGS-$(CONFIG_MARCH_X86_64_BTVER2) += -march=btver2 - - -ifeq ($(CONFIG_COMPILER), clang) -ARCHFLAGS:=$(filter-out -fno-reorder-blocks,$(ARCHFLAGS)) -ISR_ARCHFLAGS:=$(filter-out -fno-reorder-blocks,$(ISR_ARCHFLAGS)) -ISR_ARCHFLAGS:=$(filter-out -mno-fp-ret-in-387,$(ISR_ARCHFLAGS)) -endif \ No newline at end of file diff --git a/support/build/Makefile.rules b/support/build/Makefile.rules index af08f83..117fd5a 100644 --- a/support/build/Makefile.rules +++ b/support/build/Makefile.rules @@ -29,10 +29,20 @@ lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(s # upper case uc = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$(1))))))))))))))))))))))))))) +# test if GCC is set as a compiler +define have_gcc = +$(shell if [ $(CC) = gcc ] ; then echo y ; else echo n ; fi) +endef + +# test if CLANG is set as a compiler +define have_clang = +$(shell if [ $(CC) == clang ] ; then echo y ; else echo n ; fi) +endef + # test whether GCC version is greater than or equal to the minimum requirement # gcc_version_ge $gcc_major,$gcc_minor define gcc_version_ge = -$(shell if [ $(CC_VER_MAJOR) -gt $(1) ] || ([ $(CC_VER_MAJOR) -eq $(1) ] && [ $(CC_VER_MINOR) -ge $(2) ]) ; then echo y ; fi) +$(shell if [ $(call have_gcc) = y ] ; then if [ $(CC_VER_MAJOR) -gt $(1) ] || ([ $(CC_VER_MAJOR) -eq $(1) ] && [ $(CC_VER_MINOR) -ge $(2) ]) ; then echo y ; fi ; else echo n ; fi) endef # print error and stop build when GCC version doesn't meet the minimum requirement @@ -42,6 +52,19 @@ $(if $(call gcc_version_ge,$(1),$(2)),,\ $(error Require GCC version >= $(1).$(2) found $(CC_VER_MAJOR).$(CC_VER_MINOR))) endef +# test whether CLANG version is greater than or equal to the minimum requirement +# clang_version_ge $clang_major, $clang_minor +define clang_version_ge = +$(shell if [ $(call have_clang) = y ] ; then if [ $(CC_VER_MAJOR) -gt $(1) ] || ([ $(CC_VER_MAJOR) -eq $(1) ] && [ $(CC_VER_MINOR) -ge $(2) ]) ; then echo y ; fi ; else echo n ; fi) +endef + +# print error and stop build when CLANG version doesn't meet the minimum requirement +# error_if_clang_version_lt $clang_major,$clang_minor. +define error_if_clang_version_lt = +$(if $(call clang_version_ge,$(1),$(2)),,\ + $(error Require CLANG version >= $(1).$(2) found $(CC_VER_MAJOR).$(CC_VER_MINOR))) +endef + ################################################################################ # # Paths and Filenames -- 2.17.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |