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 Initial Version

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

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:

pt/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 (0)

Note: See TracTickets for help on using tickets.