Thanks. The error you're seeing "unable to determine target CPU features for target i686-pc-linux-gnu"
looks as though it's because i686-pc-linux-gnu isn't listed as a target in driver/ArchCpusAttrs.h. >From the root of your repo, try $ cd tools $ go build capture-fcn-attributes.go $ ./capture-fcn-attributes -o ../driver/ArchCpusAttrs.h and then give the gollvm build another try. Thanks, Than On Wed, Jan 6, 2021 at 12:53 PM Ivan Serdyuk <local.tourist.k...@gmail.com> wrote: > Here you go: > > ~/Desktop/workarea/llvm-project/llvm/tools/gollvm$ git diff > diff --git a/cmake/modules/AutoGenGo.cmake b/cmake/modules/AutoGenGo.cmake > index 3e3ab83..097a2ad 100644 > --- a/cmake/modules/AutoGenGo.cmake > +++ b/cmake/modules/AutoGenGo.cmake > @@ -51,6 +51,17 @@ function(mkversion goos goarch outfile bindir srcroot > scriptroot) > set(pcquantum "1") > set(int64align "8") > set(minframesize 0) > + elseif( ${goarch} STREQUAL "386") > + # Simply picking up one typical setting > + # Align with current sets in gofrontend/libgo/goarch.sh > + set(archfamily "I386") > + set(bigendian "false") > + set(cachelinesize "64") > + set(physpagesize "4096") > + set(pcquantum "1") > + set(int64align "4") > + set(minframesize 4) > + set(ptrsize 4) > elseif( ${goarch} STREQUAL "arm64") > # Simply picking up one typical setting > # Align with current sets in gofrontend/libgo/goarch.sh > diff --git a/cmake/modules/GoVars.cmake b/cmake/modules/GoVars.cmake > index ec6f6b2..0cea38a 100644 > --- a/cmake/modules/GoVars.cmake > +++ b/cmake/modules/GoVars.cmake > @@ -8,6 +8,9 @@ list(GET lht_components 2 goos) > # LLVM's "x86_64" is the same as Go's "amd64". > if( ${llarch} STREQUAL "x86_64" ) > set(goarch "amd64") > +# For i386/i686 > +elseif( ${llarch} STREQUAL "i686" ) > + set(goarch "386") > # LLVM's "aarch64" is the same as Go's "arm64". > elseif( ${llarch} STREQUAL "aarch64" ) > set(goarch "arm64") > @@ -23,6 +26,10 @@ set(allgoos "aix" "android" "darwin" "dragonfly" > "freebsd" "irix" "linux" "netbs > # Set library suffix based on target triple > if( ${llarch} STREQUAL "x86_64" ) > set(library_suffix "64") > +elseif( ${llarch} STREQUAL "i686" ) > +# Driver::installedLibDir honors ./lib only, on Ubuntu 16 > +# But we can stick for ./lib32 (along with those in AddGollvm.cmake) > + set(library_suffix "32") > elseif( ${llarch} STREQUAL "aarch64" ) > # Driver::installedLibDir honors ./lib64 only > # Future change needed (along with those in AddGollvm.cmake) > diff --git a/cmake/modules/LibbacktraceUtils.cmake > b/cmake/modules/LibbacktraceUtils.cmake > index dc54f18..42287a9 100644 > --- a/cmake/modules/LibbacktraceUtils.cmake > +++ b/cmake/modules/LibbacktraceUtils.cmake > @@ -8,6 +8,9 @@ function(setup_libbacktrace) > if( ${goarch} STREQUAL "amd64") > set(BACKTRACE_ELF_SIZE 64) > set(HAVE_GETIPINFO 1) > + elseif( ${goarch} STREQUAL "386") > + set(BACKTRACE_ELF_SIZE 32) > + set(HAVE_GETIPINFO 1) > elseif( ${goarch} STREQUAL "arm64") > set(BACKTRACE_ELF_SIZE 64) > set(HAVE_GETIPINFO 1) > diff --git a/cmake/modules/LibffiUtils.cmake > b/cmake/modules/LibffiUtils.cmake > index b3fa697..fb34c36 100644 > --- a/cmake/modules/LibffiUtils.cmake > --- a/cmake/modules/LibffiUtils.cmake > +++ b/cmake/modules/LibffiUtils.cmake > @@ -9,6 +9,8 @@ function(setup_libffi libffi_srcroot) > set(arch_dir "aarch64") > elseif(${llarch} STREQUAL "x86_64") > set(arch_dir "x86") > + elseif(${llarch} STREQUAL "i686") > + set(arch_dir "x86") > else() > message(SEND_ERROR "Arch ${llarch} not yet supported") > endif() > diff --git a/driver/Driver.cpp b/driver/Driver.cpp > index 8debbab..aa83fb1 100644 > --- a/driver/Driver.cpp > +++ b/driver/Driver.cpp > @@ -76,7 +76,7 @@ std::string Driver::installedLibDir() > llvm::sys::path::append(ldir, "../lib64"); > break; > default: > - llvm::sys::path::append(ldir, "../lib64"); > + llvm::sys::path::append(ldir, "../lib"); > break; > } > : > --- a/cmake/modules/LibffiUtils.cmake > +++ b/cmake/modules/LibffiUtils.cmake > @@ -9,6 +9,8 @@ function(setup_libffi libffi_srcroot) > set(arch_dir "aarch64") > elseif(${llarch} STREQUAL "x86_64") > set(arch_dir "x86") > + elseif(${llarch} STREQUAL "i686") > + set(arch_dir "x86") > else() > message(SEND_ERROR "Arch ${llarch} not yet supported") > endif() > diff --git a/driver/Driver.cpp b/driver/Driver.cpp > index 8debbab..aa83fb1 100644 > --- a/driver/Driver.cpp > +++ b/driver/Driver.cpp > @@ -76,7 +76,7 @@ std::string Driver::installedLibDir() > llvm::sys::path::append(ldir, "../lib64"); > break; > default: > - llvm::sys::path::append(ldir, "../lib64"); > + llvm::sys::path::append(ldir, "../lib"); > break; > } > return std::string(ldir.str()); > > and > > $ git log -1 > commit 850255c5cd7f9df79a148d537fd395089b7caf29 (HEAD -> master, > origin/master, origin/HEAD) > Author: Ivan Serdyuk <local.tourist.k...@gmail.com> > Date: Fri Dec 4 17:14:00 2020 +0200 > > gollvm: Updating README.md, to elevate the min. required version of > Clang compiler > > Too many issues with Clang 9 - so let's assume Clang 10+ > > Change-Id: Icf1a74148878b07fd941e5d525ac7e0c7f6bfdaf > Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/275473 > Reviewed-by: Than McIntosh <th...@google.com> > Trust: Ian Lance Taylor <i...@golang.org> > > On Wednesday, January 6, 2021 at 5:34:17 PM UTC+2 th...@google.com wrote: > >> Diff is fine. No need for the entire folder. >> Than >> >> >> On Wed, Jan 6, 2021 at 10:18 AM Ivan Serdyuk <local.tou...@gmail.com> >> wrote: >> >>> Than, >>> I could perform "git diff" and provide the generated file. >>> I could also compress & share the build folder. >>> What else would be required? >>> >>> Ivan >>> >>> On Wednesday, January 6, 2021 at 5:07:06 PM UTC+2 th...@google.com >>> wrote: >>> >>>> >>>> It would be helpful if you could put up a CL that includes all of the >>>> changes you're testing -- at this point do you have any modifications to >>>> driver/ArchCpusAttrs.h ? >>>> >>>> Thanks >>>> >>>> >>>> >>>> On Wed, Jan 6, 2021 at 10:00 AM Ivan Serdyuk <local.tou...@gmail.com> >>>> wrote: >>>> >>>>> Ping >>>>> >>>>> On Friday, January 1, 2021 at 5:45:02 AM UTC+2 Ivan Serdyuk wrote: >>>>> >>>>>> Happy New Year, Than. >>>>>> >>>>>> So I have rebuilt llvm-goc, after applying >>>>>> https://go-review.googlesource.com/c/gollvm/+/270219. >>>>>> Here >>>>>> <https://drive.google.com/file/d/1qDSKwKORZjH824gVeSXUknVm0rpKZ9j-/view?usp=sharing> >>>>>> is my compressed build folder. >>>>>> >>>>>> I am using >>>>>> $ clang --version >>>>>> clang version 12.0.0 >>>>>> Target: i686-pc-linux-gnu >>>>>> Thread model: posix >>>>>> on >>>>>> $ uname -a >>>>>> Linux oceanfish81-A8He 4.15.0-129-generic #132-Ubuntu SMP Thu Dec 10 >>>>>> 14:07:35 UTC 2020 i686 i686 i686 GNU/Linux >>>>>> >>>>>> You can obtain a pre-compiler "MinSizeRel" build of LLVM (including >>>>>> Clang) here >>>>>> <https://drive.google.com/file/d/1c7wredQbaX4p20Ee15WnY3SblbjiQHMD/view?usp=sharing> >>>>>> . >>>>>> >>>>>> I tried to build an avarage libgo package - and here is what I got: >>>>>> >>>>>> $ ninja libgo_golang.org_x_crypto_chacha20 >>>>>> [1/120] Building Go package 'unicode' (non-PIC) >>>>>> FAILED: tools/gollvm/libgo/unicode.o >>>>>> cd /home/oceanfish81/Desktop/workarea/release/tools/gollvm/libgo && >>>>>> /usr/local/bin/cmake -E make_directory ./. && >>>>>> /home/oceanfish81/Desktop/workarea/release/./bin/llvm-goc -c -o >>>>>> /home/oceanfish81/Desktop/workarea/release/tools/gollvm/libgo/./unicode.o >>>>>> -fgo-pkgpath=unicode -I . >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/unicode/casetables.go >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/unicode/digit.go >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/unicode/graphic.go >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/unicode/letter.go >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/unicode/tables.go >>>>>> currently Gollvm is not supported on architecture i686 >>>>>> /home/oceanfish81/Desktop/workarea/release/./bin/llvm-goc: *unable >>>>>> to determine target CPU features for target i686-pc-linux-gnu* >>>>>> [2/120] Building Go package 'internal/unsafeheader' (PIC) >>>>>> FAILED: tools/gollvm/libgo/internal/.pic/unsafeheader.o >>>>>> cd /home/oceanfish81/Desktop/workarea/release/tools/gollvm/libgo && >>>>>> /usr/local/bin/cmake -E make_directory ./internal/.pic && >>>>>> /home/oceanfish81/Desktop/workarea/release/./bin/llvm-goc -c -o >>>>>> /home/oceanfish81/Desktop/workarea/release/tools/gollvm/libgo/internal/.pic/unsafeheader.o >>>>>> -fPIC -fgo-pkgpath=internal/unsafeheader -I . >>>>>> /home/oceanfish81/Desktop/workarea/llvm-project/llvm/tools/gollvm/gofrontend/libgo/go/internal/unsafeheader/unsafeheader.go >>>>>> currently Gollvm is not supported on architecture i686 >>>>>> /home/oceanfish81/Desktop/workarea/release/./bin/llvm-goc: *unable >>>>>> to determine target CPU features for target i686-pc-linux-gnu* >>>>>> ninja: build stopped: subcommand failed. >>>>>> >>>>>> Ivan >>>>>> On Tuesday, December 8, 2020 at 3:30:05 PM UTC+2 th...@google.com >>>>>> wrote: >>>>>> >>>>>>> Hello, >>>>>>> >>>>>>> Thanks for the note. >>>>>>> >>>>>>> I am still not completely sure what the problem is. >>>>>>> >>>>>>> >>>>>>> You wrote: >>>>>>> >>>>>>> | I found >>>>>>> | >>>>>>> | // triple: i686-pc-linux-gnu >>>>>>> | static const CpuAttrs attrs1[] = { >>>>>>> | // first entry is default cpu >>>>>>> | { "i686", "+cx8,+x87"}, >>>>>>> | >>>>>>> | and (inside the hashmap) >>>>>>> | >>>>>>> | { "yonah", "+cx8,+fxsr,+mmx,+sse,+sse2,+sse3,+x87"}, >>>>>>> | , which is not what I have supported (for Intel Celeron M440). >>>>>>> >>>>>>> What makes you say that this is not what you have supported? Are you >>>>>>> saying that the cpu clang calls "yonah" doesn't actually have one of >>>>>>> these >>>>>>> features (ex: sse3)? >>>>>>> >>>>>>> >>>>>>> | Clang reports "unsupported CPU features" on any non-provided one. >>>>>>> | So that is one big problem. >>>>>>> >>>>>>> Not sure what you mean here. Can you please post the complete clang >>>>>>> invocation and error message you are getting? >>>>>>> >>>>>>> >>>>>>> >>>>>>> | const TripleCpus triples[] = { >>>>>>> | { "x86_64-unknown-linux-gnu", &attrs0[0] }, >>>>>>> | { "i686-pc-linux-gnu", &attrs1[0] }, >>>>>>> | { "aarch64-unknown-linux-gnu", &attrs2[0] }, >>>>>>> | { "", nullptr } // sentinel >>>>>>> | }; >>>>>>> | is not targeting to yonah, while llc is targeting it. >>>>>>> | It is always some "default" CPU model and, in fact, your code >>>>>>> never provided extraction of the CPU model (from llc). >>>>>>> | >>>>>>> >>>>>>> When llc emits the line >>>>>>> >>>>>>> Host CPU: yonah >>>>>>> >>>>>>> this does not mean that clang/llc will automatically target 'yonah' >>>>>>> when compiling, it just means that the program has detected the host >>>>>>> CPU. >>>>>>> >>>>>>> Generally speaking if you want clang to produce code targeted >>>>>>> specifically to the host CPU, you have to use -march=native or >>>>>>> -mtune-native. >>>>>>> >>>>>>> Thanks, Than >>>>>>> >>>>>>> On Fri, Dec 4, 2020 at 8:08 PM Ivan Serdyuk <local.tou...@gmail.com> >>>>>>> wrote: >>>>>>> >>>>>>>> Hello. >>>>>>>> >>>>>>>> This issue is related to >>>>>>>> https://go-review.googlesource.com/c/gollvm/+/274574 >>>>>>>> . >>>>>>>> >>>>>>>> I think I have some misunderstanding on how you used to deal with >>>>>>>> CPU models, for LLVM. >>>>>>>> >>>>>>>> First things first - I had success with using >>>>>>>> >>>>>>>> #include "llvm/ADT/StringRef.h" >>>>>>>> #include "llvm/ADT/StringMap.h" >>>>>>>> #include "llvm/MC/SubtargetFeature.h" >>>>>>>> #include "llvm/Support/Host.h" >>>>>>>> >>>>>>>> using namespace llvm; >>>>>>>> SubtargetFeatures Features1; >>>>>>>> >>>>>>>> int main (int argc, char **argv) >>>>>>>> { >>>>>>>> sys::getHostCPUName(); >>>>>>>> StringMap HostFeatures; >>>>>>>> if (sys::getHostCPUFeatures(HostFeatures)) >>>>>>>> for (auto &F : HostFeatures) >>>>>>>> Features1.AddFeature(F.first(), F.second); >>>>>>>> >>>>>>>> printf("test %s", Features1.getString().c_str()); >>>>>>>> printf("\nsomething else\n"); >>>>>>>> return 0; >>>>>>>> } >>>>>>>> . It gives me such a set of CPU features: >>>>>>>> >>>>>>>> >>>>>>>> +sse2,-tsxldtrk,-cx16,-sahf,-tbm,-avx512ifma,-sha,-gfni,-fma4,-vpclmulqdq,-prfchw,-bmi2,-cldemote,-fsgsbase,-ptwrite,-amx-tile,-avx512bf16,-popcnt,-aes,-avx512bitalg,-movdiri,-xsaves,-avx512er,-xsavec,-avx512vnni,-amx-bf16,-avx512vpopcntdq,-pconfig,-clwb,-avx512f,-clzero,-pku,+mmx,-lwp,-rdpid,-xop,-rdseed,-waitpkg,-movdir64b,-sse4a,-avx512bw,-clflushopt,-xsave,-avx512vbmi2,-64bit,-avx512vl,-serialize,-invpcid,-avx512cd,-avx,-vaes,+cx8,-fma,-rtm,-bmi,-enqcmd,-rdrnd,-mwaitx,-sse4.1,-sse4.2,-avx2,+fxsr,-wbnoinvd,+sse,-lzcnt,-pclmul,-prefetchwt1,-f16c,-ssse3,-sgx,-shstk,+cmov,-avx512vbmi,-amx-int8,-movbe,-avx512vp2intersect,-xsaveopt,-avx512dq,-adx,-avx512pf,+sse3 >>>>>>>> >>>>>>>> $ llc --version >>>>>>>> provides >>>>>>>> Default target: i686-pc-linux-gnu >>>>>>>> Host CPU: yonah >>>>>>>> . >>>>>>>> >>>>>>>> I tried to update the capture-fcn-attributes.go file, like this: >>>>>>>> >>>>>>>> var supportedTriples []string = []string{ >>>>>>>> "x86_64-unknown-linux-gnu", >>>>>>>> "i686-pc-linux-gnu", >>>>>>>> "aarch64-unknown-linux-gnu", >>>>>>>> } >>>>>>>> . >>>>>>>> >>>>>>>> When I tried the generator >>>>>>>> >>>>>>>> capture-fcn-attributes -o /tmp/cpu_feature_list >>>>>>>> it generated me a broad list. >>>>>>>> The header contained >>>>>>>> >>>>>>>> Ubuntu clang version 11.0.0-++20200721055954+cebd637c886-1exp1 >>>>>>>> 20200721161335.13 >>>>>>>> . >>>>>>>> I found >>>>>>>> >>>>>>>> // triple: i686-pc-linux-gnu >>>>>>>> static const CpuAttrs attrs1[] = { >>>>>>>> // first entry is default cpu >>>>>>>> { "i686", "+cx8,+x87"}, >>>>>>>> >>>>>>>> and (inside the hashmap) >>>>>>>> >>>>>>>> { "yonah", "+cx8,+fxsr,+mmx,+sse,+sse2,+sse3,+x87"}, >>>>>>>> , which is not what I have supported (for Intel Celeron M440). >>>>>>>> Clang reports "unsupported CPU features" on any non-provided one. >>>>>>>> So that is one big problem. >>>>>>>> Next problem is that >>>>>>>> >>>>>>>> const TripleCpus triples[] = { >>>>>>>> { "x86_64-unknown-linux-gnu", &attrs0[0] }, >>>>>>>> { "i686-pc-linux-gnu", &attrs1[0] }, >>>>>>>> { "aarch64-unknown-linux-gnu", &attrs2[0] }, >>>>>>>> { "", nullptr } // sentinel >>>>>>>> }; >>>>>>>> is not targeting to yonah, while llc is targeting it. >>>>>>>> It is always some "default" CPU model and, in fact, your code never >>>>>>>> provided extraction of the CPU model (from llc). >>>>>>>> >>>>>>>> To make my observation complete - I am providing what is generated >>>>>>>> via >>>>>>>> >>>>>>>> capture-fcn-attributes -cpu yonah >>>>>>>> : >>>>>>>> >>>>>>>> // triple: x86_64-unknown-linux-gnu >>>>>>>> static const CpuAttrs attrs0[] = { >>>>>>>> // first entry is default cpu >>>>>>>> { "x86-64", "+cx8,+fxsr,+mmx,+sse,+sse2,+x87"}, >>>>>>>> { "", "" } // sentinel >>>>>>>> }; >>>>>>>> >>>>>>>> // triple: i686-pc-linux-gnu >>>>>>>> static const CpuAttrs attrs1[] = { >>>>>>>> // first entry is default cpu >>>>>>>> { "i686", "+cx8,+x87"}, >>>>>>>> { "yonah", "+cx8,+fxsr,+mmx,+sse,+sse2,+sse3,+x87"}, >>>>>>>> { "", "" } // sentinel >>>>>>>> }; >>>>>>>> >>>>>>>> // triple: aarch64-unknown-linux-gnu >>>>>>>> static const CpuAttrs attrs2[] = { >>>>>>>> // first entry is default cpu >>>>>>>> { "generic", "+neon"}, >>>>>>>> { "", "" } // sentinel >>>>>>>> }; >>>>>>>> >>>>>>>> const TripleCpus triples[] = { >>>>>>>> { "x86_64-unknown-linux-gnu", &attrs0[0] }, >>>>>>>> { "i686-pc-linux-gnu", &attrs1[0] }, >>>>>>>> { "aarch64-unknown-linux-gnu", &attrs2[0] }, >>>>>>>> { "", nullptr } // sentinel >>>>>>>> }; >>>>>>>> . >>>>>>>> >>>>>>>> I tried >>>>>>>> >>>>>>>> capture-fcn-attributes -cpu yonah -triples i686-pc-linux-gnu >>>>>>>> and got >>>>>>>> >>>>>>>> // triple: i686-pc-linux-gnu >>>>>>>> static const CpuAttrs attrs0[] = { >>>>>>>> // first entry is default cpu >>>>>>>> { "i686", "+cx8,+x87"}, >>>>>>>> { "yonah", "+cx8,+fxsr,+mmx,+sse,+sse2,+sse3,+x87"}, >>>>>>>> { "", "" } // sentinel >>>>>>>> }; >>>>>>>> >>>>>>>> const TripleCpus triples[] = { >>>>>>>> { "i686-pc-linux-gnu", &attrs0[0] }, >>>>>>>> { "", nullptr } // sentinel >>>>>>>> }; >>>>>>>> . >>>>>>>> >>>>>>>> I understand that your strategy worked find on Intel based >>>>>>>> system-on-board machines - but didn't try something for AMD (yet). >>>>>>>> Nevertheless I have these issues on i686 - so I am proposing to >>>>>>>> perform a review. >>>>>>>> >>>>>>>> >>>>>>>> Ivan >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "golang-nuts" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/golang-nuts/aac8c576-9763-4bba-96a1-51f545084630n%40googlegroups.com >>>>>>>> <https://groups.google.com/d/msgid/golang-nuts/aac8c576-9763-4bba-96a1-51f545084630n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golang-nuts...@googlegroups.com. >>>>> >>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/golang-nuts/cc763125-04fe-4a8d-9940-625c0f25cc50n%40googlegroups.com >>>>> <https://groups.google.com/d/msgid/golang-nuts/cc763125-04fe-4a8d-9940-625c0f25cc50n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> >> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/golang-nuts/67c15826-5ed2-40ca-b284-6ff471fb6584n%40googlegroups.com >>> <https://groups.google.com/d/msgid/golang-nuts/67c15826-5ed2-40ca-b284-6ff471fb6584n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/399b00c6-8a6c-46aa-8397-b7d01cd85e44n%40googlegroups.com > <https://groups.google.com/d/msgid/golang-nuts/399b00c6-8a6c-46aa-8397-b7d01cd85e44n%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CA%2BUr55FxA8SCxsjJvY5odcPuS%3DTkSj2X51PK8WRBLLrSwGK-5g%40mail.gmail.com.