From ab2d9cf6ae1e6b7be33287f6a2bf69614682805b Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 10 Sep 2016 10:11:50 +0200 Subject: [PATCH] add experimental Go support --- hermit/Makefile | 4 +++ hermit/usr/Makefile | 8 ++--- hermit/usr/gcc | 2 +- hermit/usr/tests/pi.go | 68 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 5 deletions(-) create mode 100644 hermit/usr/tests/pi.go diff --git a/hermit/Makefile b/hermit/Makefile index 1b6d74ca4..122cb6a31 100644 --- a/hermit/Makefile +++ b/hermit/Makefile @@ -16,6 +16,7 @@ STACKPROT = -fno-stack-protector FC_FOR_TARGET = $(CROSSCOMPREFIX)-gfortran CC_FOR_TARGET = $(CROSSCOMPREFIX)-gcc +GO_FOR_TARGET = $(CROSSCOMPREFIX)-gccgo CXX_FOR_TARGET = $(CROSSCOMPREFIX)-g++ GCC_FOR_TARGET = $(CROSSCOMPREFIX)-gcc CPP_FOR_TARGET = $(CROSSCOMPREFIX)-cpp @@ -55,6 +56,7 @@ ifdef PROFILING endif CFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -O3 -ftree-vectorize $(ARCH_OPT) #$(STACKPROT) +GOFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -O3 -ftree-vectorize $(ARCH_OPT) FCFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -O3 -ftree-vectorize $(ARCH_OPT) FFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -O3 -ftree-vectorize $(ARCH_OPT) CXXFLAGS_FOR_NEWLIB = -m64 -mtls-direct-seg-refs -O3 -ftree-vectorize $(ARCH_OPT) @@ -78,6 +80,7 @@ all: arch/x86/kernel/boot.h bootstrap $(NAME) toolchain tools loader toolchain: $Q$(MAKE) ARCH=$(ARCH) \ LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_NEWLIB)" \ + GOFLAGS_FOR_TARGET="$(GOFLAGS_FOR_NEWLIB)" \ CFLAGS_FOR_TARGET="$(CFLAGS_FOR_NEWLIB)" \ FFLAGS_FOR_TARGET="$(FFLAGS_FOR_NEWLIB)" \ FCFLAGS_FOR_TARGET="$(FCFLAGS_FOR_NEWLIB)" \ @@ -85,6 +88,7 @@ toolchain: CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_NEWLIB)" \ NASMFLAGS="$(NASMFLAGS_FOR_NEWLIB)" \ CC_FOR_TARGET=$(CC_FOR_TARGET) \ + GO_FOR_TARGET=$(GO_FOR_TARGET) \ FC_FOR_TARGET=$(FC_FOR_TARGET) \ CXX_FOR_TARGET=$(CXX_FOR_TARGET) \ GCC_FOR_TARGET=$(GCC_FOR_TARGET) \ diff --git a/hermit/usr/Makefile b/hermit/usr/Makefile index a074e0f7a..baea65b07 100644 --- a/hermit/usr/Makefile +++ b/hermit/usr/Makefile @@ -32,8 +32,8 @@ default: demo: @echo Build demo applications - $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C tests depend - $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C tests + $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) GO_FOR_TARGET="$(GO_FOR_TARGET)" GOFLAGS_FOR_TARGET="$(GOFLAGS_FOR_TARGET)" -C tests depend + $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) GO_FOR_TARGET="$(GO_FOR_TARGET)" GOFLAGS_FOR_TARGET="$(GOFLAGS_FOR_TARGET)" -C tests $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks depend $Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET) $(PROFILING_CFLAGS)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET) $(PROFILING_LDFLAGS)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C benchmarks #$Q$(MAKE) ELFEDIT_FOR_TARGET=$(ELFEDIT_FOR_TARGET) CC_FOR_TARGET=$(CC_FOR_TARGET) CXX_FOR_TARGET=$(CXX_FOR_TARGET) CXXFLAGS_FOR_TARGET="$(CXXFLAGS_FOR_TARGET)" CFLAGS_FOR_TARGET="$(CFLAGS_FOR_TARGET)" LDFLAGS_FOR_TARGET="$(LDFLAGS_FOR_TARGET)" OBJCOPY_FOR_TARGET=$(OBJCOPY_FOR_TARGET) -C openmpbench depend @@ -55,7 +55,7 @@ $(TMP)/bootstrap: $Q$(MKDIR) $(TMP)/bootstrap $Q$(CD) $(TMP)/bootstrap; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-isl --with-tune=generic --enable-languages=c --disable-nls --disable-shared --disable-libssp --disable-libgomp --enable-threads=posix --enable-tls && $(MAKE) $(NJOBS) all-gcc $(TP) && $(MAKE) install-gcc $(TP) -toolchain: $(TMP)/newlib pte $(TMP)/gcc libs headers demo +toolchain: $(TMP)/newlib pte headers $(TMP)/gcc libs demo $(TMP)/newlib: @echo Build newlib @@ -91,7 +91,7 @@ $(TMP)/gcc: $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --with-isl --with-tune=generic --enable-languages=c,lto --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) $(TP) && $(MAKE) install $(TP) $Q$(RM) $(TMP)/gcc $Q$(MKDIR) $(TMP)/gcc - $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --with-isl --with-tune=generic --enable-languages=c,c++,fortran,lto --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) $(TP) && $(MAKE) install $(TP) + $Q$(CD) $(TMP)/gcc; $(TOPDIR)/gcc/configure --target=$(TARGET) --prefix=$(TOPDIR)/$(ARCH) --without-headers --with-newlib --with-isl --without-libatomic --with-tune=generic --enable-languages=c,c++,go,fortran,lto --disable-nls --disable-shared --disable-libssp --enable-threads=posix --disable-libgomp --enable-tls --enable-lto --disable-symvers && $(MAKE) $(NJOBS) $(TP) && $(MAKE) install $(TP) clean: @echo Cleaning toolchain diff --git a/hermit/usr/gcc b/hermit/usr/gcc index e3ac291d9..d686639af 160000 --- a/hermit/usr/gcc +++ b/hermit/usr/gcc @@ -1 +1 @@ -Subproject commit e3ac291d9fa7ae33dca5625970098984af0ec7dc +Subproject commit d686639afb35650edf0d55647b7e8b30e8f1f989 diff --git a/hermit/usr/tests/pi.go b/hermit/usr/tests/pi.go new file mode 100644 index 000000000..a6d41e234 --- /dev/null +++ b/hermit/usr/tests/pi.go @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2016, Stefan Lankes, RWTH Aachen University + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package main + +import ( + "fmt" + "os" + "strconv" + "time" +) + +func term(i int, step float64) (x float64) { + x = (float64(i) + 0.5) * step + x = 4.0 / (1.0 + x * x) + + return +} + +func main() { + var num_steps int + + if len(os.Args) > 1 { + num_steps, _ = strconv.Atoi(os.Args[1]) + } + if num_steps < 100 { + num_steps = 1000000 + } + fmt.Println("num_steps = ", num_steps) + + sum := float64(0) + step := 1.0 / float64(num_steps) + + start := time.Now() + + for i := 0; i < num_steps; i++ { + sum += term(i, step) + } + + elapsed := time.Since(start) + + fmt.Println("Pi : ", sum*step) + fmt.Println("Time : ", elapsed) +}