Opened 5 years ago

Last modified 5 years ago

#58493 closed defect

cctools: using clang < 5.0 as default assembler generates assembly errors in some cases — at Version 1

Reported by: kencu (Ken) Owned by: jeremyhu (Jeremy Huddleston Sequoia)
Priority: Normal Milestone:
Component: ports Version:
Keywords: Cc: jmroot (Joshua Root), cjones051073 (Chris Jones)
Port: cctools

Description (last modified by kencu (Ken))

To fix errors in newer ports that require gcc (fortran) to assemble newer assembly, the as in cctools was modified to send the assembly to a specific version of clang for processing, if present. For SnowLeopard, that default clang version is clang-3.4.

It turns out there is (at least one) bug in the clang i386 assembler that was not fixed until after clang-3.7. It is fixed in clang-5.0. This error shows up during the build or bootstrapping of gcc / libgcc, and perhaps will turn up elsewhere:

/opt/local/i386-apple-darwin10/bin/ -nostdinc++ -B/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/src/.libs -B/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/libsupc++/.libs  -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/include/i386-apple-darwin10  -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/include  -isystem /opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/gcc-9.1.0/libstdc++-v3/libsupc++ -L/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/src/.libs -L/opt/local/var/macports/build/_opt_macports-ports_lang_gcc9/libgcc9/work/build/prev-i386-apple-darwin10/libstdc++-v3/libsupc++/.libs    -g -O2  -fno-checking -mdynamic-no-pic -gtoggle -DIN_GCC     -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings   -DHAVE_CONFIG_H -static-libstdc++ -static-libgcc  -o cc1 c/c-lang.o c-family/stub-objc.o attribs.o c/c-errors.o c/c-decl.o c/c-typeck.o c/c-convert.o c/c-aux-info.o c/c-objc-common.o c/c-parser.o c/c-fold.o c/gimple-parser.o c-family/c-common.o c-family/c-cppbuiltin.o c-family/c-dump.o c-family/c-format.o c-family/c-gimplify.o c-family/c-indentation.o c-family/c-lex.o c-family/c-omp.o c-family/c-opts.o c-family/c-pch.o c-family/c-ppoutput.o c-family/c-pragma.o c-family/c-pretty-print.o c-family/c-semantics.o c-family/c-ada-spec.o c-family/c-ubsan.o c-family/known-headers.o c-family/c-attribs.o c-family/c-warn.o c-family/c-spellcheck.o i386-c.o darwin-c.o \
	  cc1-checksum.o libbackend.a main.o libcommon-target.a libcommon.a ../libcpp/libcpp.a ../libdecnumber/libdecnumber.a libcommon.a ../libcpp/libcpp.a  -liconv ../libbacktrace/.libs/libbacktrace.a ../libiberty/libiberty.a ../libdecnumber/libdecnumber.a  -L/opt/local/lib -lisl -L/opt/local/lib -L/opt/local/lib -L/opt/local/lib -lmpc -lmpfr -lgmp   -lz
ld: in libbackend.a(i386.o), in section __TEXT,__text reloc 5479: unsupported r_length=0 for scattered vanilla reloc for architecture i386

This is a known clang assembler error <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63773>.

There is a reduced test case for it:

	.text
	.align 4,0x90
	.globl _choose_tmpdir
_choose_tmpdir:
	sbbl	$3+_vartmp, %esi
	ret
	.space 254

	.const
	.align 2
_vartmp:
	.byte	47

and I confirm that clang-3.4 and clang-3.7 error out on this assembly, but clang-5.0 can compile it successfully:

$ clang-mp-3.4 -arch i386  testi386asm.S
ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-fc6237.o, in section __TEXT,__text reloc 0: unsupported r_length=0 for scattered vanilla reloc for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

$ clang-mp-3.7 -arch i386  testi386asm.S
ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-c2fa0b.o, in section __TEXT,__text reloc 0: unsupported r_length=0 for scattered vanilla reloc for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

$ clang-mp-5.0 -arch i386  testi386asm.S
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Likewise, the same assembly generates errors when compiling in x86_64 mode.

$ clang-mp-3.4 -arch x86_64  testi386asm.S
ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-07fc5b.o, in section __TEXT,__text reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

$ clang-mp-3.7 -arch x86_64  testi386asm.S
ld: in /var/folders/If/IfyiELboGT08qyd+9nD3DU+++TI/-Tmp-/testi386asm-52d45e.o, in section __TEXT,__text reloc 0: length < 2 and X86_64_RELOC_UNSIGNED not supported for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

$ clang-mp-5.0 -arch x86_64  testi386asm.S
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64

So - it appears that clang should not be used as the default assembler unless it is clang-5.0 or greater, and for the system clang should not be used (according to the gcc bug report) unless the Xcode version is at least 7.3.1.

This probably requires only a rather minor adjustment to the cctools port.

Change History (1)

comment:1 Changed 5 years ago by kencu (Ken)

Description: modified (diff)
Note: See TracTickets for help on using tickets.