Go front end review: files outside gofrontend/
Joseph S. Myers
joseph@codesourcery.com
Sat Nov 6 19:13:00 GMT 2010
I'll try to review the Go front-end files. This message reviews those
outside the gofrontend/ subdirectory, from
svn://gcc.gnu.org/svn/gcc/branches/gccgo/gcc/go r166404:
Review of Make-lang.in:
> # C++ support. This should really be in the top level Makefile.
>
> ALL_CXXFLAGS = $(filter-out -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition -Wc++-compat, $(ALL_COMPILERFLAGS)) $(CXXFLAGS)
So put it there? Isn't this relevant to general C++ building support?
> # Build Go export info generator.
> INTERNAL_CFLAGS += -DGO_DEBUGGING_INFO
What code is conditioned on this define?
> GCCGO_OBJS = $(GCC_OBJS) gospec.o intl.o prefix.o version.o
> gccgo$(exeext): $(GCCGO_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS)
> $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
> $(GCCGO_OBJS) $(EXTRA_GCC_OBJS) $(LIBS)
Shouldn't this use $(LINKER) and $(ALL_LINKERFLAGS)?
> go1$(exeext): $(GO_OBJS) attribs.o $(BACKEND) $(LIBDEPS)
> $(CXX) $(STATIC_LIBSTDCXX) $(ALL_CXXFLAGS) $(LDFLAGS) -o $@ \
> $(GO_OBJS) attribs.o $(BACKEND) $(LIBS) $(BACKENDLIBS)
If someone uses the various configure options such as
--with-host-libstdcxx to control linking with libstdc++ (and to link with
a static libstdc++ with a compiler predating -static-libstdc++, say), how
will that interact with this link command? (The expectation with
--with-host-libstdcxx is that linking ends up using the C compiler to
avoid the driver doing the linking implicitly adding its own notion of the
C++ standard library.)
> # Create a version of the g++ driver which calls the cross-compiler.
Not g++....
> gccgo-cross$(exeext): gccgo$(exeext)
> -rm -f gccgo-cross$(exeext)
> cp gccgo$(exeext) gccgo-cross$(exeext)
I don't actually see anything using this binary.
The install rules below:
> go.install-common: installdirs
> -rm -f $(DESTDIR)$(bindir)/$(GCCGO_INSTALL_NAME)$(exeext)
> -$(INSTALL_PROGRAM) gccgo$(exeext) $(DESTDIR)$(bindir)/$(GCCGO_INSTALL_NAME)$(exeext)
> -chmod a+x $(DESTDIR)$(bindir)/$(GCCGO_INSTALL_NAME)$(exeext)
are generally more sensible than the cargo-culted rules in other
directories that involve checking for a -cross binary and possibly
installing a non-functioning copy of the driver in $(gcc_tooldir)/bin/.
But if you have these rules you shouldn't still have the -cross binary.
And I think the *correct* rules everywhere ought to involve installing the
$(target_noncanonical)-{gcc,g++,gccgo,etc.} driver everywhere (though most
languages install one for both native and cross, this patch would not
install one for gccgo for native) and not installing any copies in
$(gcc_tooldir)/bin/ - furthermore, at least the $(INSTALL_PROGRAM)
commands should not ignore errors.
> go.install-pdf:
> go.html:
The install-html hook appears to be missing.
> GO_SYSTEM_H = go/go-system.h $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
> $(DIAGNOSTIC_CORE_H) $(INPUT_H)
Limiting front-end dependence on target macros and tm.h is generally a
good idea; putting tm.h into a header included everywhere is a less good
idea. What are the actual target macro dependencies in the Go front end?
Can you contain them within files outside the gofrontend/ directory?
Review of go-c.h:
> extern int go_enable_dump(const char*);
Existing GCC and GNU style has the space before the open parenthesis. I
think this should apply at least to all the C/C++ code outside the
gofrontend/ subdirectory.
Review of go-lang.c:
> /* The sizetype may be "unsigned long" or "unsigned long long". */
> if (TYPE_MODE (long_unsigned_type_node) == ptr_mode)
> size_type_node = long_unsigned_type_node;
> else if (TYPE_MODE (long_long_unsigned_type_node) == ptr_mode)
> size_type_node = long_long_unsigned_type_node;
> else
> size_type_node = long_unsigned_type_node;
This exists in other front ends so isn't an obstacle to inclusion, but
it's also ugly. Hopefully at some point we'll transition macros such as
SIZE_TYPE to evaluate to enum values rather than strings (and then convert
them to hooks), so avoiding the need for such hacks for non-C-family front
ends to work out a suitable sizetype, and also avoiding Fortran needing
its own type name parsing code (get_typenode_from_name) to implement the C
bindings.
> set_sizetype(size_type_node);
Missing space.
> /* Initialize before parsing options. */
>
> static void
> go_langhook_init_options (
> unsigned int argc ATTRIBUTE_UNUSED,
> struct cl_decoded_option *decoded_options ATTRIBUTE_UNUSED)
As previously noted, use the init_options_struct hook as far as possible.
> /* We default to always showing a column number. */
> flag_show_column = 1;
This is the GCC default now. The variable (field in global_options) only
exists for initialization in toplev.c:general_init and for the sake of
reporting option state; the setting in global_dc is used for everything
else.
> void
> go_preserve_from_gc(tree t)
Missing space.
Review of go-system.h:
> #include <tr1/unordered_map>
So you're requiring more than just the intersection of C++98 with the C++
language supported by some baseline GCC version (the agreed language for
GCC-in-C++, I think)? How widespread is <tr1/unordered_map> support in
C++ implementations? What was the first GCC version with it? How hard
would it be to provide a C++ equivalent of libiberty that provides such
facilities on systems that don't have them (which seems analogous to how
we handle missing C library facilities)?
Or do we believe this is not an issue as long as we don't use TR1
facilities in code required for the C and C++ compilers, because we can
have stricter requirements for building cross compilers and for native
compilers a new libstdc++ will be built with the stage 1 C++ compiler?
(If so, the documentation of prerequisites in install.texi still needs to
say what GCC version is needed to build a Go cross compiler.)
> extern "C"
If GCC is built as C++, don't the various GCC headers you're including
inside extern "C" actually describe C++ interfaces rather than C ones?
How does this work?
> #include "tm.h"
(Remarked upon above.)
Review of gospec.c:
> #ifndef THREAD_LIBRARY
> #define THREAD_LIBRARY "pthread"
> #endif
> #ifndef THREAD_LIBRARY_PROFILE
> #define THREAD_LIBRARY_PROFILE THREAD_LIBRARY
> #endif
>
> #ifndef LIBGO
> #define LIBGO "go"
> #endif
> #ifndef LIBGOBEGIN
> #define LIBGOBEGIN "gobegin"
> #endif
> #ifndef LIBGO_PROFILE
> #define LIBGO_PROFILE LIBGO
> #endif
By using #ifndef you're implicitly creating new target macros. But I
don't see any documentation of these macros in tm.texi.in on the branch.
Do you really need to allow for these things to be changed by targets? If
so, the macros need documenting; if not, don't use #ifndef.
> /* If nonzero, the user gave us the `-p' or `-pg' flag. */
> int saw_profile_flag = 0;
New code should be using bool for booleans, not int (and false/true not
0/1).
I have no comments on files outside gofrontend/ not mentioned above.
--
Joseph S. Myers
joseph@codesourcery.com
More information about the Gcc-patches
mailing list