[build] Remove support for building with the Intel C compiler

Support for building with the Intel C compiler (icc) was added in 2009
in the expectation that UEFI support would eventually involve
compiling iPXE to EFI Byte Code.

EFI Byte Code has never found any widespread use: no widely available
compilers can emit it, Microsoft refuses to sign EFI Byte Code
binaries for UEFI Secure Boot, and I have personally never encountered
any examples of EFI Byte Code in the wild.

The support for using the Intel C compiler has not been tested in over
a decade, and would almost certainly require modification to work with
current releases of the compiler.

Simplify the build process by removing this old legacy code.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/259/head
Michael Brown 2021-02-12 21:56:53 +00:00
parent df16df2c85
commit b539e9a7e9
6 changed files with 5 additions and 287 deletions

View File

@ -48,7 +48,6 @@ ELF2EFI32 := ./util/elf2efi32
ELF2EFI64 := ./util/elf2efi64
EFIROM := ./util/efirom
EFIFATBIN := ./util/efifatbin
ICCFIX := ./util/iccfix
EINFO := ./util/einfo
GENKEYMAP := ./util/genkeymap.pl
DOXYGEN := doxygen

View File

@ -76,9 +76,7 @@ CCDEFS := $(shell $(CC) -E -x c -c /dev/null -dM | cut -d" " -f2)
ccdefs:
@$(ECHO) $(CCDEFS)
ifeq ($(filter __ICC,$(CCDEFS)),__ICC)
CCTYPE := icc
else
ifeq ($(filter __GNUC__,$(CCDEFS)),__GNUC__)
CCTYPE := gcc
endif
cctype:
@ -466,32 +464,6 @@ CFLAGS += -fcommon
CFLAGS += -Wall -W -Wformat-nonliteral
HOST_CFLAGS += -Wall -W -Wformat-nonliteral
endif
ifeq ($(CCTYPE),icc)
CFLAGS += -fno-builtin
CFLAGS += -no-ip
CFLAGS += -no-gcc
CFLAGS += -diag-disable 111 # Unreachable code
CFLAGS += -diag-disable 128 # Unreachable loop
CFLAGS += -diag-disable 170 # Array boundary checks
CFLAGS += -diag-disable 177 # Unused functions
CFLAGS += -diag-disable 181 # printf() format checks
CFLAGS += -diag-disable 188 # enum strictness
CFLAGS += -diag-disable 193 # Undefined preprocessor identifiers
CFLAGS += -diag-disable 280 # switch ( constant )
CFLAGS += -diag-disable 310 # K&R parameter lists
CFLAGS += -diag-disable 424 # Extra semicolon
CFLAGS += -diag-disable 589 # Declarations mid-code
CFLAGS += -diag-disable 593 # Unused variables
CFLAGS += -diag-disable 810 # Casting ints to smaller ints
CFLAGS += -diag-disable 981 # Sequence point violations
CFLAGS += -diag-disable 1292 # Ignored attributes
CFLAGS += -diag-disable 1338 # void pointer arithmetic
CFLAGS += -diag-disable 1361 # Variable-length arrays
CFLAGS += -diag-disable 1418 # Missing prototypes
CFLAGS += -diag-disable 1419 # Missing prototypes
CFLAGS += -diag-disable 1599 # Hidden variables
CFLAGS += -Wall -Wmissing-declarations
endif
CFLAGS += $(WORKAROUND_CFLAGS) $(EXTRA_CFLAGS)
ASFLAGS += $(WORKAROUND_ASFLAGS) $(EXTRA_ASFLAGS)
LDFLAGS += $(WORKAROUND_LDFLAGS) $(EXTRA_LDFLAGS)
@ -555,16 +527,6 @@ OBJ_CFLAGS = $(CFLAGS_$(OBJECT)) -DOBJECT=$(subst -,_,$(OBJECT))
$(BIN)/%.flags :
@$(ECHO) $(OBJ_CFLAGS)
# ICC requires postprocessing objects to fix up table alignments
#
ifeq ($(CCTYPE),icc)
POST_O = && $(ICCFIX) $@
POST_O_DEPS := $(ICCFIX)
else
POST_O :=
POST_O_DEPS :=
endif
# Debug level calculations
#
DBGLVL_MAX = -DDBGLVL_MAX=$(firstword $(subst ., ,$(1)))
@ -574,9 +536,9 @@ DBGLVL = $(call DBGLVL_MAX,$(1)) $(call DBGLVL_DFLT,$(1))
# Rules for specific object types.
#
COMPILE_c = $(CC) $(CFLAGS) $(CFLAGS_c) $(OBJ_CFLAGS)
RULE_c = $(Q)$(COMPILE_c) -c $< -o $@ $(POST_O)
RULE_c = $(Q)$(COMPILE_c) -c $< -o $@
RULE_c_to_ids.o = $(Q)$(ECHO_E) '$(OBJ_IDS_ASM_NL)' | $(ASSEMBLE_S) -o $@
RULE_c_to_dbg%.o= $(Q)$(COMPILE_c) $(call DBGLVL,$*) -c $< -o $@ $(POST_O)
RULE_c_to_dbg%.o= $(Q)$(COMPILE_c) $(call DBGLVL,$*) -c $< -o $@
RULE_c_to_c = $(Q)$(COMPILE_c) -E -c $< > $@
RULE_c_to_s = $(Q)$(COMPILE_c) -S -g0 -c $< -o $@
@ -919,7 +881,7 @@ endef
# $(3) is the source base name (e.g. "rtl8139")
#
define rules_template_parts
$$(BIN)/$(3).o : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)
$$(BIN)/$(3).o : $(1) $$(MAKEDEPS) $$($(3)_DEPS)
$$(QM)$(ECHO) " [BUILD] $$@"
$$(RULE_$(2))
BOBJS += $$(BIN)/$(3).o
@ -934,7 +896,7 @@ endef
# $(4) is the destination type (e.g. "dbg%.o")
#
define rules_template_target
$$(BIN)/$(3).$(4) : $(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)
$$(BIN)/$(3).$(4) : $(1) $$(MAKEDEPS) $$($(3)_DEPS)
$$(QM)$(ECHO) " [BUILD] $$@"
$$(RULE_$(2)_to_$(4))
$(TGT)_OBJS += $$(BIN)/$(3).$(4)
@ -1473,15 +1435,6 @@ $(EFIFATBIN) : util/efifatbin.c $(MAKEDEPS)
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $<
CLEANUP += $(EFIFATBIN)
###############################################################################
#
# The ICC fixup utility
#
$(ICCFIX) : util/iccfix.c $(MAKEDEPS)
$(QM)$(ECHO) " [HOSTCC] $@"
$(Q)$(HOST_CC) $(HOST_CFLAGS) -idirafter include -o $@ $<
CLEANUP += $(ICCFIX)
###############################################################################
#
# The error usage information utility

View File

@ -29,11 +29,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
/* EFI headers redefine ARRAY_SIZE */
#undef ARRAY_SIZE
/* EFI headers expect ICC to define __GNUC__ */
#if defined ( __ICC ) && ! defined ( __GNUC__ )
#define __GNUC__ 1
#endif
/* EFI headers think your compiler uses the MS ABI by default on X64 */
#if __x86_64__
#define EFIAPI __attribute__((ms_abi))

View File

@ -444,75 +444,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
pointer >= table_start ( table ) ; \
pointer-- )
/******************************************************************************
*
* Intel's C compiler chokes on several of the constructs used in this
* file. The workarounds are ugly, so we use them only for an icc
* build.
*
*/
#define ICC_ALIGN_HACK_FACTOR 128
#ifdef __ICC
/*
* icc miscompiles zero-length arrays by inserting padding to a length
* of two array elements. We therefore have to generate the
* __table_entries() symbols by hand in asm.
*
*/
#undef __table_entries
#define __table_entries( table, idx ) ( { \
extern __table_type ( table ) \
__table_temp_sym ( idx, __LINE__ ) [] \
__table_entry ( table, idx ) \
asm ( __table_entries_sym ( table, idx ) ); \
__asm__ ( ".ifndef %c0\n\t" \
".section " __table_section ( table, idx ) "\n\t" \
".align %c1\n\t" \
"\n%c0:\n\t" \
".previous\n\t" \
".endif\n\t" \
: : "i" ( __table_temp_sym ( idx, __LINE__ ) ), \
"i" ( __table_alignment ( table ) ) ); \
__table_temp_sym ( idx, __LINE__ ); } )
#define __table_entries_sym( table, idx ) \
"__tbl_" __table_name ( table ) "_" #idx
#define __table_temp_sym( a, b ) \
___table_temp_sym( __table_, a, _, b )
#define ___table_temp_sym( a, b, c, d ) a ## b ## c ## d
/*
* icc ignores __attribute__ (( aligned (x) )) when it is used to
* decrease the compiler's default choice of alignment (which may be
* higher than the alignment actually required by the structure). We
* work around this by forcing the alignment to a large multiple of
* the required value (so that we are never attempting to decrease the
* default alignment) and then postprocessing the object file to
* reduce the alignment back down to the "real" value.
*
*/
#undef __table_alignment
#define __table_alignment( table ) \
( ICC_ALIGN_HACK_FACTOR * __alignof__ ( __table_type ( table ) ) )
/*
* Because of the alignment hack, we must ensure that the compiler
* never tries to place multiple objects within the same section,
* otherwise the assembler will insert padding to the (incorrect)
* alignment boundary. Do this by appending the line number to table
* section names.
*
* Note that we don't need to worry about padding between array
* elements, since the alignment is declared on the variable (i.e. the
* whole array) rather than on the type (i.e. on all individual array
* elements).
*/
#undef __table_section
#define __table_section( table, idx ) \
".tbl." __table_name ( table ) "." __table_str ( idx ) \
"." __table_xstr ( __LINE__ )
#define __table_xstr( x ) __table_str ( x )
#endif /* __ICC */
#endif /* _IPXE_TABLES_H */

1
src/util/.gitignore vendored
View File

@ -6,5 +6,4 @@ elf2efi32
elf2efi64
efirom
efifatbin
iccfix
einfo

View File

@ -1,157 +0,0 @@
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <elf.h>
#include <ipxe/tables.h>
#define DEBUG 0
#define eprintf(...) fprintf ( stderr, __VA_ARGS__ )
#define dprintf(...) do { \
if ( DEBUG ) \
fprintf ( stderr, __VA_ARGS__ ); \
} while ( 0 )
#ifdef SELF_INCLUDED
/**
* Fix up ICC alignments
*
* @v elf ELF header
* @ret rc Return status code
*
* See comments in tables.h for an explanation of why this monstrosity
* is necessary.
*/
static int ICCFIX ( void *elf ) {
ELF_EHDR *ehdr = elf;
ELF_SHDR *shdr = ( elf + ehdr->e_shoff );
size_t shentsize = ehdr->e_shentsize;
unsigned int shnum = ehdr->e_shnum;
ELF_SHDR *strtab = ( ( ( void * ) shdr ) +
( ehdr->e_shstrndx * shentsize ) );
char *strings = ( elf + strtab->sh_offset );
for ( ; shnum-- ; shdr = ( ( ( void * ) shdr ) + shentsize ) ) {
char *name = ( strings + shdr->sh_name );
unsigned long align = shdr->sh_addralign;
unsigned long new_align;
if ( ( strncmp ( name, ".tbl.", 5 ) == 0 ) &&
( align >= ICC_ALIGN_HACK_FACTOR ) ) {
new_align = ( align / ICC_ALIGN_HACK_FACTOR );
shdr->sh_addralign = new_align;
dprintf ( "Section \"%s\": alignment %ld->%ld\n",
name, align, new_align );
}
}
return 0;
}
#else /* SELF_INCLUDED */
#define SELF_INCLUDED
/* Include iccfix32() function */
#define ELF_EHDR Elf32_Ehdr
#define ELF_SHDR Elf32_Shdr
#define ICCFIX iccfix32
#include "iccfix.c"
#undef ELF_EHDR
#undef ELF_SHDR
#undef ICCFIX
/* Include iccfix64() function */
#define ELF_EHDR Elf64_Ehdr
#define ELF_SHDR Elf64_Shdr
#define ICCFIX iccfix64
#include "iccfix.c"
#undef ELF_EHDR
#undef ELF_SHDR
#undef ICCFIX
static int iccfix ( const char *filename ) {
int fd;
struct stat stat;
void *elf;
unsigned char *eident;
int rc;
/* Open and mmap file */
fd = open ( filename, O_RDWR );
if ( fd < 0 ) {
eprintf ( "Could not open %s: %s\n",
filename, strerror ( errno ) );
rc = -1;
goto err_open;
}
if ( fstat ( fd, &stat ) < 0 ) {
eprintf ( "Could not determine size of %s: %s\n",
filename, strerror ( errno ) );
rc = -1;
goto err_fstat;
}
elf = mmap ( NULL, stat.st_size, ( PROT_READ | PROT_WRITE ),
MAP_SHARED, fd, 0 );
if ( elf == MAP_FAILED ) {
eprintf ( "Could not map %s: %s\n",
filename, strerror ( errno ) );
rc = -1;
goto err_mmap;
}
/* Perform fixups */
eident = elf;
switch ( eident[EI_CLASS] ) {
case ELFCLASS32:
rc = iccfix32 ( elf );
break;
case ELFCLASS64:
rc = iccfix64 ( elf );
break;
default:
eprintf ( "Unknown ELF class %d in %s\n",
eident[EI_CLASS], filename );
rc = -1;
break;
}
munmap ( elf, stat.st_size );
err_mmap:
err_fstat:
close ( fd );
err_open:
return rc;
}
int main ( int argc, char **argv ) {
int i;
int rc;
/* Parse command line */
if ( argc < 2 ) {
eprintf ( "Syntax: %s <object_file>...\n", argv[0] );
exit ( 1 );
}
/* Process each object in turn */
for ( i = 1 ; i < argc ; i++ ) {
if ( ( rc = iccfix ( argv[i] ) ) != 0 ) {
eprintf ( "Could not fix up %s\n", argv[i] );
exit ( 1 );
}
}
return 0;
}
#endif /* SELF_INCLUDED */