Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Sep 2017 16:00:00 -0700
From:      <soralx@cydem.org>
To:        <vbox@FreeBSD.org>
Subject:   Re: [virtualbox-ose] Build failure: global register variable
Message-ID:  <20170921160000.689755f8@mscad14>
In-Reply-To: <20170920191710.58d335df@mscad14>
References:  <20170917195419.431341e7@mscad14> <20170920191710.58d335df@mscad14>

next in thread | previous in thread | raw e-mail | index | archive | help

> > [...]
> > kBuild: Compiling VBoxRemPrimary
> > - /usr/ports/emulators/virtualbox-ose/work/VirtualBox-5.1.28/src/recompiler/target-i386/op_helper.c
> > In file included
> > from /usr/ports/emulators/virtualbox-ose/work/VirtualBox-5.1.28/src/recompiler/target-i386/op_helper.c:29:
> >     /usr/ports/emulators/virtualbox-ose/work/VirtualBox-5.1.28/src/recompiler/target-i386/exec.h:41:38:
> > error: register 'r14' unsuitable for global register variables on this
> > target register struct CPUX86State *env asm(AREG0); ^
> > /usr/ports/emulators/virtualbox-ose/work/VirtualBox-5.1.28/src/recompiler/dyngen-exec.h:81:15:
> > note: expanded from macro 'AREG0'
> > #define AREG0 "r14"  
> 
> Turns out that the fix for this is to make sure that devel/kBuild
> is compiled with GCC, not clang; thus, that module of VBox that
> has global register variable (and fails to build with clang) is
> automagically built with gcc. So some parts of VBox are built
> with base clang, some with gcc from ports; it is awkward, but
> it all works somehow.

Alternatively, one can try changing 'r14' to 'rbp' in definition
of "AREG0" for amd64 at src/recompiler/dyngen-exec.h:81. This is
the only place where gcc is needed, as clang cannot handle r14
for now [0].

I recompiled kBuild with clang, and succeeded compiling virtualbox-ose
with 'r14' to 'rbp' change. It seems to work normally, but I don't know
what are the performance implications of using up rbp.

[0] clang/lib/Basic/Targets/X86.h:
  860   bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize,
  861                                       bool &HasSizeMismatch) const override {
  862     // rsp and rbp are the only 64-bit registers the x86 backend can currently
  863     // handle.
  864     if (RegName.equals("rsp") || RegName.equals("rbp")) {
  865       // Check that the register size is 64-bit.
  866       HasSizeMismatch = RegSize != 64;
  867       return true;
  868     }

-- 
[SorAlx]  ridin' VN2000 Classic LT



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170921160000.689755f8>