Date: Wed, 7 Dec 2016 20:00:57 +0100 From: Roman Divacky <rdivacky@vlakno.cz> To: Mark Millard <markmi@dsl-only.net> Cc: FreeBSD Toolchain <freebsd-toolchain@freebsd.org>, Justin Hibbits <chmeeedalf@gmail.com>, FreeBSD PowerPC ML <freebsd-ppc@freebsd.org> Subject: Re: clang 3.9.0 buildkernel on old powerpc64's vs. trying to build hwpmc_e500.o and the like. . . Message-ID: <20161207190057.GA58950@vlakno.cz> In-Reply-To: <D9C54972-8D21-4D55-A707-4FFC2BDCD9FE@dsl-only.net> References: <300CB7A2-34BB-407F-B2E9-D263B119A989@dsl-only.net> <20161205161904.GA7889@vlakno.cz> <126E2EDE-9499-4103-A3DB-CC517105DAB2@dsl-only.net> <D3DE2D12-9885-4154-B680-6DA5A8B62A56@dsl-only.net> <D9C54972-8D21-4D55-A707-4FFC2BDCD9FE@dsl-only.net>
next in thread | previous in thread | raw e-mail | index | archive | help
Can the compiler you built with the patch process this file: typedef int register_t; #define mtpmr(reg, val) \ __asm __volatile("mtpmr %0,%1" : : "K"(reg), "r"(val)) #define mfpmr(reg) \ ( { register_t val; \ __asm __volatile("mfpmr %0,%1" : "=3Dr"(val) : "K"(reg)); \ val; } ) #define PMR_PMC0 16 int foo() { return mfpmr(PMR_PMC0); } I can compile it just fine locally. Not sure why it wouldnt work in your ca= se. On Mon, Dec 05, 2016 at 05:42:28PM -0800, Mark Millard wrote: > On 2016-Dec-5, at 5:16 PM, Mark Millard <markmi at dsl-only.net> wrote: >=20 > > Well it looks like: > >=20 > > WITHOUT_CROSS_COMPILER=3D > > WITH_SYSTEM_COMPILER=3D > >=20 > > ignores the .td file change but > >=20 > > WITH_CROSS_COMPILER=3D > > WITHOUT_SYSTEM_COMPILER=3D > >=20 > > may use it. > >=20 > > I had accidentally used a SRC_CONF_ENV file that > > was of the first form. > >=20 > > So I've got a build going based on the 2nd form. . . >=20 > No such luck: same type of failure at the same point. >=20 > =3D=3D=3D > Mark Millard > markmi at dsl-only.net >=20 > On 2016-Dec-5, at 4:05 PM, Mark Millard <markmi at dsl-only.net> wrote: >=20 > On 2016-Dec-5, at 8:19 AM, Roman Divacky <rdivacky at vlakno.cz> wrote: >=20 > > Can you try this patch? > >=20 > > Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > > --- llvm/lib/Target/PowerPC/PPCInstrInfo.td (revision 288675) > > +++ llvm/lib/Target/PowerPC/PPCInstrInfo.td (working copy) > > @@ -2373,6 +2373,12 @@ > > def MFTB : XFXForm_1<31, 371, (outs gprc:$RT), (ins i32imm:$SPR), > > "mftb $RT, $SPR", IIC_SprMFTB>; > >=20 > > +def MFPMR : XFXForm_1<31, 334, (outs gprc:$RT), (ins i32imm:$PMRN), > > + "mfpmr $RT, $PMRN", IIC_IntGeneral>; > > + > > +def MTPMR : XFXForm_1<31, 462, (outs), (ins i32imm:$PMRN, gprc:$RS), > > + "mtpmr $PMRN, $RS", IIC_IntGeneral>; > > + > > // A pseudo-instruction used to implement the read of the 64-bit cycle = counter > > // on a 32-bit target. > > let hasSideEffects =3D 1, usesCustomInserter =3D 1 in >=20 > Direct use of the patch (put into a file) was rejected: >=20 > # patch -p0 < llvmPPCInstrInfo_td.patch=20 > Hmm... Looks like a unified diff to me... > The text leading up to this was: > -------------------------- > |Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td > |=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > |--- llvm/lib/Target/PowerPC/PPCInstrInfo.td (revision 288675) > |+++ llvm/lib/Target/PowerPC/PPCInstrInfo.td (working copy) > -------------------------- > Patching file llvm/lib/Target/PowerPC/PPCInstrInfo.td using Plan A... > patch: **** malformed patch at line 6: def MFTB : XFXForm_1<31, 371, (out= s gprc:$RT), (ins i32imm:$SPR), >=20 > So I hand put in the extra lines. >=20 > I'll note that in llvm/lib/Target/PowerPC/PPCInstrInfo.td -r309124 > the MFTB line is at line number 2300 while your patch listed: >=20 > @@ -2373,6 +2373,12 @@ >=20 > My edit shows as: >=20 > # svnlite diff contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td > Index: contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > --- contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td (revision 309179) > +++ contrib/llvm/lib/Target/PowerPC/PPCInstrInfo.td (working copy) > @@ -2300,6 +2300,12 @@ > def MFTB : XFXForm_1<31, 371, (outs gprc:$RT), (ins i32imm:$SPR), > "mftb $RT, $SPR", IIC_SprMFTB>; >=20 > +def MFPMR : XFXForm_1<31, 334, (outs gprc:$RT), (ins i32imm:$PMRN), > + "mfpmr $RT, $PMRN", IIC_IntGeneral>; > + > +def MTPMR : XFXForm_1<31, 462, (outs), (ins i32imm:$PMRN, gprc:$RS), > + "mtpmr $PMRN, $RS", IIC_IntGeneral>; > + > // A pseudo-instruction used to implement the read of the 64-bit cycle co= unter > // on a 32-bit target. > let hasSideEffects =3D 1, usesCustomInserter =3D 1 in >=20 >=20 > Unfortunately the buildkernel still gets the same errors: > (This was tried after a kernel-toolchain .) >=20 > # Meta data file /usr/obj/powerpc64vtsc_clang_altbinutils_kernel/powerpc.= powerpc64/usr/src/sys/GENERIC64vtsc-NODBG/modules/usr/src/sys/modules/hwpmc= /hwpmc_e500.o.meta > CMD /usr/bin/clang -B /usr/local/powerpc64-freebsd/bin/ -target powerpc64= -unknown-freebsd12.0 --sysroot=3D/usr/obj/powerpc64vtsc_clang_altbinutils_k= ernel/powerpc.powerpc64/usr/src/tmp -B/usr/local/powerpc64-freebsd/bin/ -O= 2 -pipe -fno-strict-aliasing -D_KERNEL -DKLD_MODULE -nostdinc -DHAVE_KER= NEL_OPTION_HEADERS -include /usr/obj/powerpc64vtsc_clang_altbinutils_kernel= /powerpc.powerpc64/usr/src/sys/GENERIC64vtsc-NODBG/opt_global.h -I. -I/usr/= src/sys -fno-common -g -fno-omit-frame-pointer -I/usr/obj/powerpc64vtsc_cla= ng_altbinutils_kernel/powerpc.powerpc64/usr/src/sys/GENERIC64vtsc-NODBG -m= no-altivec -ffreestanding -fwrapv -fstack-protector -gdwarf-2 -Wall -Wredun= dant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpoin= ter-arith -Winline -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=3D__f= reebsd_kprintf__ -Wmissing-include-dirs -fdiagnostics-show-option -Wno-unkn= own-pragmas -Wno-error-tautological-compare -Wno-error-empty-body -Wno-erro= r-parentheses-equality -Wno-e > rror-unused-function -Wno-error-pointer-sign -Wno-error-shift-negative-va= lue -msoft-float -std=3Diso9899:1999 -c /usr/src/sys/modules/hwpmc/../../= dev/hwpmc/hwpmc_e500.c -o hwpmc_e500.o > CMD ctfconvert -L VERSION -g hwpmc_e500.o > CWD /usr/obj/powerpc64vtsc_clang_altbinutils_kernel/powerpc.powerpc64/usr= /src/sys/GENERIC64vtsc-NODBG/modules/usr/src/sys/modules/hwpmc > TARGET hwpmc_e500.o > -- command output -- > /usr/src/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_e500.c:475:19: error: un= recognized instruction mnemonic > uint32_t pmgc0 =3D mfpmr(PMR_PMGC0); > ^ > ./machine/pmc_mdep.h:24:21: note: expanded from macro 'mfpmr' > __asm __volatile("mfpmr %0,%1" : "=3Dr"(val) : "K"(reg)); \ > ^ > <inline asm>:1:2: note: instantiated into assembly here > mfpmr 3,400 > ^ > /usr/src/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_e500.c:478:2: error: unr= ecognized instruction mnemonic > mtpmr(PMR_PMGC0, pmgc0); > ^ > ./machine/pmc_mdep.h:21:19: note: expanded from macro 'mtpmr' > __asm __volatile("mtpmr %0,%1" : : "K"(reg), "r"(val)) > ^ > <inline asm>:1:2: note: instantiated into assembly here > mtpmr 400,3 > ^ > /usr/src/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_e500.c:446:2: error: unr= ecognized instruction mnemonic > mtpmr(PMR_PMGC0, PMGC_FAC | PMGC_PMIE | PMGC_FCECE); > ^ > ./machine/pmc_mdep.h:21:19: note: expanded from macro 'mtpmr' > __asm __volatile("mtpmr %0,%1" : : "K"(reg), "r"(val)) > ^ > <inline asm>:1:2: note: instantiated into assembly here > mtpmr 400,3 > ^ > /usr/src/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_e500.c:408:14: error: un= recognized instruction mnemonic > pmc_pmlc =3D mfpmr(PMR_PMLCa0); > ^ > ./machine/pmc_mdep.h:24:21: note: expanded from macro 'mfpmr' > __asm __volatile("mfpmr %0,%1" : "=3Dr"(val) : "K"(reg)); \ > ^ > <inline asm>:1:2: note: instantiated into assembly here > mfpmr 10,144 > ^ > . . . >=20 >=20 > =3D=3D=3D > Mark Millard > markmi at dsl-only.net >=20 > Older content: >=20 > On Sat, Dec 03, 2016 at 08:35:50PM -0800, Mark Millard wrote: > > [Note: At present I can buildworld using WITH_LIB32=3D on > > powerpc64 for TARGET_ARCH=3Dpowerpc64 via clang 3.9.0 from a > > minor variant of head -r309179 . That does not work for > > amd64 cross compiling to powerpc64 due to assembler > > notation rejections.] > >=20 > > When I attempt to buildkernel (with WERROR=3D ) via FreeBSD's > > clang 3.9.0 I get the following sorts of error > > reports, *even building on powerpc64* : > >=20 > > --- hwpmc_e500.o --- > > /usr/src/sys/modules/hwpmc/../../dev/hwpmc/hwpmc_e500.c:475:19: error: = unrecognized instruction mnemonic > > uint32_t pmgc0 =3D mfpmr(PMR_PMGC0); > > ^ > > ./machine/pmc_mdep.h:24:21: note: expanded from macro 'mfpmr' > > __asm __volatile("mfpmr %0,%1" : "=3Dr"(val) : "K"(reg)); \ > > ^ > > <inline asm>:1:2: note: instantiated into assembly here > > mfpmr 3,400 > > ^ > > . . . > >=20 > > When I look up these instructions I find that they are not > > classic powerpc instructions: > > ( http://www.nxp.com/assets/documents/data/en/white-papers/POWRPCARCPRM= RM.pdf ) > >=20 > >> Whereas the classic architecture defines special-purpose registers (SP= Rs) and > >> two instructions to access them (Move to Special-Purpose Register (mts= pr) and > >> Move from Special-Purpose Register (mfspr)), Book E takes that model a= nd defines > >> optional device control registers (DCRs) and mtdcr and mfdcr instructi= ons, and > >> the EIS-defined performance monitor APU defines performance monitor re= gisters > >> (PMRs) and mtpmr and mfpmr instructions, all based on models provided = by the > >> UISA. > >=20 > > . . . > >=20 > > Does this imply that clang 3.9.0 needs to support more instructions when > > it is targeting FreeBSD for GENERIC64 based builds? (I include GENERIC64 > > and then override some items for my build activity.) > >=20 > > If yes, then someone probably needs to make a list of what instructions > > need to be present and have someone submit the list into llvm's bugzilla > > and have the submittal listed in: > >=20 > > [META] Using Clang as the FreeBSD/ppc system compiler > >=20 > > (25780). > >=20 > >=20 > > If GENERIC64 does not need the likes of hwpmc_e500.o built then some > > work on the build environment to avoid GENERIC64 including things with > > non-classic instruction use would appear to be needed. (No llvm > > involvement for this case.) I doubt this is the case as it would > > seem that the problem would reoccur when alternate KERNCONF's were > > in use instead that do require something like of hwpmc_e500.o to be > > built. > >=20 > >=20 > > Note: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=3D214903 is abo= ut > > this issue from the FreeBSD side of things. I just noticed the status > > of the specific instructions involved and also that the cross-build > > and on-powerpc64 build get the same result (unlike the recent > > WITH_LIB32=3D discovery). > >=20 > > =3D=3D=3D > > Mark Millard > > markmi at dsl-only.net >=20 >=20 > _______________________________________________ > freebsd-ppc@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-ppc > To unsubscribe, send any mail to "freebsd-ppc-unsubscribe@freebsd.org"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20161207190057.GA58950>