[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
powerpc-elf-netbsd patch for gcc-2.8.0 & profile
gcc-2.8.0 patchです。
前のとの違いは、profileできるようになってます。
# quick hackなので、よくわからん部分は飛ばしてます :-)
前回のpatchでも、
-pgで、確かにprofiling用のコードを生成しますが、
多分バグってるし(addis 11,11,ADDRESSってなってる。
addis 11,0,ADDRESSが正しいと思う)、
SVR4用だし(netbsdのgprofは多分使えない)、なので、
NetBSD用のprofileコードを生成するようにしました。
gcc-2.8.0を作ったら、profile.hをDESTDIR/usr/include/machineに置いて、
DESTDIR/usr/share/mk/bsd.own.mkのpowerpcではNOPROFを
セットするところを削除します。
で、libcを作成すれば、libc.a,libc_p.aができます。
これでpowerpc-elf-netbsd-gcc -pg hoge.cとすれば、
gmon.outをはく、プログラムを作成できます。
ただminbrkというのがundefineになると思うので、int minbrk;とか
追加しておきましょう :-) 多分できると思うけど試してないっす
本当はlib/libc/arch/powerpc/sys/brk.Sにあるべきですが...
どう追加すべきか、まだちゃんと見てないので。
で、gprofは、普通にmakeしても作られません。
gnu/dist/gprofのns532.[ch]をpowerpc.[ch]にコピーしてください。
これでmakeできるはず。
これでuserlandでprofilingできるはずです。
# config -p GENERICで、kernelを作ってみたけど、
# kgmon -bで stall :-P
# sysctlから追っかけないと...
sakamoto@cec.co.jp
---cut here---
# This is a shell archive. Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file". Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
# gcc-2.8.0-diffs
# profile.h
#
echo x - gcc-2.8.0-diffs
sed 's/^X//' >gcc-2.8.0-diffs << 'END-of-gcc-2.8.0-diffs'
X*** configure.orig Tue Dec 23 20:19:51 1997
X--- configure Sun Feb 22 21:42:15 1998
X***************
X*** 4517,4522 ****
X--- 4517,4529 ----
X fi
X xmake_file=rs6000/x-sysv4
X ;;
X+ powerpc-elf-netbsd*)
X+ tm_file=rs6000/netbsd.h
X+ xm_file=rs6000/xm-netbsd.h
X+ fixincludes=Makefile.in
X+ tmake_file=t-libc-ok
X+ xmake_file=x-netbsd
X+ ;;
X powerpc-*-eabiaix*)
X tm_file=rs6000/eabiaix.h
X tmake_file="rs6000/t-ppcgas rs6000/t-ppccomm"
X*** /dev/null Sun Feb 22 21:40:42 1998
X--- config/rs6000/netbsd.h Sun Feb 22 21:40:27 1998
X***************
X*** 0 ****
X--- 1,72 ----
X+ #include <rs6000/sysv4.h>
X+
X+ /* Get generic NetBSD definitions. */
X+
X+ #include <netbsd.h>
X+
X+ /* Use bcopy etc. instead of memcpy etc. */
X+ #undef TARGET_MEM_FUNCTIONS
X+
X+ /* Names to predefine in the preprocessor for this target machine. */
X+ #undef CPP_PREDEFINES
X+ #define CPP_PREDEFINES "-D__powerpc__ -D__PPC__ -D__NetBSD__ -Asystem(unix) -Asystem(NetBSD) -Acpu(powerpc) -Amachine(powerpc)"
X+
X+ /* Make gcc agree with <machine/ansi.h> */
X+
X+ #undef SIZE_TYPE
X+ #define SIZE_TYPE "unsigned int"
X+
X+ #undef PTRDIFF_TYPE
X+ #define PTRDIFF_TYPE "int"
X+
X+ #undef WCHAR_TYPE
X+ #define WCHAR_TYPE "int"
X+
X+ #undef WCHAR_TYPE_SIZE
X+ #define WCHAR_TYPE_SIZE 32
X+
X+ /* Don't default to pcc-struct-return, because gcc is the only compiler, and
X+ we want to retain compatibility with older gcc versions. */
X+ #define DEFAULT_PCC_STRUCT_RETURN 0
X+
X+ /* Until gcc uses fixed functions on procedure entry, -mmultiple is probably
X+ more efficient due to smaller code and less cache thrashing. */
X+ #undef CC1_SPEC
X+ #define CC1_SPEC "-mmultiple"
X+
X+ /* We want a implemetation reserved symbol for the entry point! */
X+ #undef LINK_SPEC
X+ #define LINK_SPEC "%{!nostdlib:%{!r*:%{!e*:-e _start}}} -dc -dp %{static:-Bstatic} %{assert*}"
X+
X+ /* Provide a STARTFILE_SPEC appropriate for NetBSD. Here we add
X+ the crtbegin.o file (see crtstuff.c) which provides part of the
X+ support for getting C++ file-scope static object constructed
X+ before entering `main'. */
X+
X+ #undef STARTFILE_SPEC
X+ #define STARTFILE_SPEC \
X+ "%{!shared: \
X+ %{pg:gcrt0.o%s} \
X+ %{!pg: \
X+ %{p:gcrt0.o%s} \
X+ %{!p:crt0.o%s}}} \
X+ %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}"
X+
X+ /* Provide a ENDFILE_SPEC appropriate for NetBSD. Here we tack on
X+ the file which provides part of the support for getting C++
X+ file-scope static object deconstructed after exiting `main' */
X+
X+ #undef ENDFILE_SPEC
X+ #define ENDFILE_SPEC \
X+ "%{!shared:crtend.o%s} %{shared:crtendS.o%s}"
X+
X+ #undef FUNCTION_PROFILER
X+ #define FUNCTION_PROFILER(FILE, LABELNO) \
X+ { \
X+ fprintf (FILE, "\tmflr %s\n", reg_names[0]); \
X+ fprintf (FILE, "\tstw %s,4(%s)\n", reg_names[0], reg_names[1]); \
X+ /* XXX PIC?? */ \
X+ fprintf (FILE, "\tbl _mcount\n"); \
X+ fprintf (FILE, "\tlwz %s,4(%s)\n", reg_names[0], reg_names[1]); \
X+ fprintf (FILE, "\tmtlr %s\n", reg_names[0]); \
X+ }
X*** /dev/null Sun Feb 22 21:40:42 1998
X--- config/rs6000/xm-netbsd.h Fri Feb 20 19:08:02 1998
X***************
X*** 0 ****
X--- 1,9 ----
X+ /* Configuration for GCC for PowerPC running NetBSD as host. */
X+
X+ #include <rs6000/xm-rs6000.h>
X+
X+ /* NetBSD isn't SysV */
X+ #undef USG
X+
X+ /* Not needed on NetBSD (really?) */
X+ #undef COLLECT_EXPORT_LIST
END-of-gcc-2.8.0-diffs
echo x - profile.h
sed 's/^X//' >profile.h << 'END-of-profile.h'
X/* $NetBSD: profile.h,v 1.1 1997/10/14 06:48:35 sakamoto Exp $ */
X
X/*
X * Copyright (c) 1992, 1993
X * The Regents of the University of California. All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X * notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X * notice, this list of conditions and the following disclaimer in the
X * documentation and/or other materials provided with the distribution.
X * 3. All advertising materials mentioning features or use of this software
X * must display the following acknowledgement:
X * This product includes software developed by the University of
X * California, Berkeley and its contributors.
X * 4. Neither the name of the University nor the names of its contributors
X * may be used to endorse or promote products derived from this software
X * without specific prior written permission.
X *
X * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X * @(#)profile.h 8.1 (Berkeley) 6/11/93
X */
X
X#define _MCOUNT_DECL void mcount
X
X#define MCOUNT __asm__ ("
X .globl _mcount;
X_mcount:;
X mflr 0;
X stwu 1, -48(1); /* save register */
X stw 0, 44(1);
X stw 3, 40(1);
X stw 4, 36(1);
X stw 5, 32(1);
X stw 6, 28(1);
X stw 7, 24(1);
X stw 8, 20(1);
X stw 9, 16(1);
X stw 10, 12(1);
X stw 11, 8(1);
X stw 12, 4(1);
X
X mr 3, 0; /* selfpc */
X lwz 4, 52(1); /* frompc */
X bl mcount;
X
X lwz 0, 44(1); /* restore register */
X lwz 3, 40(1);
X lwz 4, 36(1);
X lwz 5, 32(1);
X lwz 6, 28(1);
X lwz 7, 24(1);
X lwz 8, 20(1);
X lwz 9, 16(1);
X lwz 10, 12(1);
X lwz 11, 8(1);
X lwz 12, 4(1);
X mtlr 0;
X lwz 1, 0(1);
X blr;
X");
X
X#ifdef _KERNEL
X#define MCOUNT_ENTER s = splhigh()
X#define MCOUNT_EXIT splx(s)
X#endif
END-of-profile.h
exit