快乐虾
http://blog.youkuaiyun.com/lights_joy/
lights@hb165.com
本文适用于
gcc- 4.3.1
Blackfin系列DSP
Visual Studio 2005
欢迎转载,但请保留作者信息
在Makefile.in中有这样的语句:
options.h: s-options-h ; @true
s-options-h: optionlist $(srcdir)/opt-functions.awk $(srcdir)/opth-gen.awk
$(AWK) -f $(srcdir)/opt-functions.awk -f $(srcdir)/opth-gen.awk /
< $< > tmp-options.h
$(SHELL) $(srcdir)/../move-if-change tmp-options.h options.h
$(STAMP) $@
它将取决于optionlist文件,再查optionlist:
optionlist: s-options ; @true
s-options: $(ALL_OPT_FILES) Makefile $(srcdir)/opt-gather.awk
$(AWK) -f $(srcdir)/opt-gather.awk $(ALL_OPT_FILES) > tmp-optionlist
$(SHELL) $(srcdir)/../move-if-change tmp-optionlist optionlist
$(STAMP) s-options
在这里用到了一个变量ALL_OPT_FILES,看看它是什么东西:
ALL_OPT_FILES=$(lang_opt_files) $(extra_opt_files)
查一下lang_opt_files,在configure脚本中这样定义:
for lang in ${srcdir}/*/config-lang.in
do
……………….
if test -f $srcdir/$subdir/lang.opt; then
lang_opt_files="$lang_opt_files $srcdir/$subdir/lang.opt"
fi
……………….
done
从这里我们就可以知道$lang_opt_files的值将为
”treelang/lang.opt”
再找extra_opt_files,在configure脚本有如下语句:
# Convert extra_options into a form suitable for Makefile use.
extra_opt_files=
for f in $extra_options; do
extra_opt_files="$extra_opt_files /$(srcdir)/config/$f"
done
在这里用到了extra_options变量,在config.gcc中对这个值进行了设置:
if test -f ${srcdir}/config/${cpu_type}/${cpu_type}.opt
then
extra_options="${extra_options} ${cpu_type}/${cpu_type}.opt"
fi
bfin*-uclinux*)
tm_file="${tm_file} dbxelf.h elfos.h bfin/elf.h linux.h bfin/uclinux.h"
tmake_file=bfin/t-bfin-uclinux
tm_defines="${tm_defines} UCLIBC_DEFAULT=1"
extra_options="${extra_options} linux.opt"
use_collect2=no
;;
因此extra_tions的值为:
“bfin/bfin.opt linux.opt”
回到extra_opt_files的定义上来,由extra_options的值可知,extra_opt_files的值将为:
“config/bfin/bfin.opt config/linux.opt”
这样我们就可以知道在Makefile中ALL_OPT_FILES这个变量的值为:
”treelang/lang.opt config/bfin/bfin.opt config/linux.opt”
执行awk命令,可以得到optionlist文件的内容:
LanguageTreelang
flexer-traceTreelangTrace lexical analysis
fparser-traceTreelangTrace the parsing process
mcpu=Target RejectNegative JoinedSpecify the name of the target CPU
mcsync-anomalyTarget Report Var(bfin_csync_anomaly) Init(-1)Work around a hardware anomaly by adding a number of NOPs before aCSYNC or SSYNC instruction.
mfast-fpTarget Report Mask(FAST_FP)Link with the fast floating-point library
mfdpicTarget Report Mask(FDPIC)Enable Function Descriptor PIC mode
mglibcTarget RejectNegative Report InverseMask(UCLIBC, GLIBC) Var(linux_uclibc) VarExistsUse GNU libc instead of uClibc
mid-shared-libraryTarget Report Mask(ID_SHARED_LIBRARY)Enabled ID based shared library
minline-pltTarget Report Mask(INLINE_PLT)Enable inlining of PLT in function calls
mleaf-id-shared-libraryTarget Report Mask(LEAF_ID_SHARED_LIBRARY)Generate code that won't be linked against any other ID shared libraries,but may be used as a shared library.
mlong-callsTarget Report Mask(LONG_CALLS)Avoid generating pc-relative calls; use indirection
mlow64kTarget Report Mask(LOW_64K)Program is entirely located in low 64k of memory
momit-leaf-frame-pointerTarget Report Mask(OMIT_LEAF_FRAME_POINTER)Omit frame pointer for leaf functions
msep-dataTarget Report Mask(SEP_DATA)Enable separate data segment
mshared-library-id=Target RejectNegative Joined UInteger Var(bfin_library_id)ID of shared library to build
msimTarget RejectNegativeUse simulator runtime
mspecld-anomalyTarget Report Var(bfin_specld_anomaly) Init(-1)Avoid speculative loads to work around a hardware anomaly.
mstack-check-l1Target Report Mask(STACK_CHECK_L1)Do stack checking using bounds in L1 scratch memory
muclibcTarget RejectNegative Report Mask(UCLIBC) Var(linux_uclibc) Init(UCLIBC_DEFAULT ? OPTION_MASK_UCLIBC : 0)Use uClibc instead of GNU libc
vTreelang
yTreelang
再执行awk命令生成options.h:
/* This file is auto-generated by opth-gen.awk. */
#ifndef OPTIONS_H
#define OPTIONS_H
extern int target_flags;
extern int target_flags_explicit;
extern int bfin_csync_anomaly;
extern int linux_uclibc;
extern int bfin_library_id;
extern int bfin_specld_anomaly;
extern int linux_uclibc;
#define MASK_FAST_FP (1 << 0)
#define MASK_FDPIC (1 << 1)
#define MASK_ID_SHARED_LIBRARY (1 << 2)
#define MASK_INLINE_PLT (1 << 3)
#define MASK_LEAF_ID_SHARED_LIBRARY (1 << 4)
#define MASK_LONG_CALLS (1 << 5)
#define MASK_LOW_64K (1 << 6)
#define MASK_OMIT_LEAF_FRAME_POINTER (1 << 7)
#define MASK_SEP_DATA (1 << 8)
#define MASK_STACK_CHECK_L1 (1 << 9)
#define OPTION_MASK_UCLIBC (1 << 0)
#define TARGET_FAST_FP ((target_flags & MASK_FAST_FP) != 0)
#define TARGET_FDPIC ((target_flags & MASK_FDPIC) != 0)
#define TARGET_ID_SHARED_LIBRARY ((target_flags & MASK_ID_SHARED_LIBRARY) != 0)
#define TARGET_INLINE_PLT ((target_flags & MASK_INLINE_PLT) != 0)
#define TARGET_LEAF_ID_SHARED_LIBRARY ((target_flags & MASK_LEAF_ID_SHARED_LIBRARY) != 0)
#define TARGET_LONG_CALLS ((target_flags & MASK_LONG_CALLS) != 0)
#define TARGET_LOW_64K ((target_flags & MASK_LOW_64K) != 0)
#define TARGET_OMIT_LEAF_FRAME_POINTER ((target_flags & MASK_OMIT_LEAF_FRAME_POINTER) != 0)
#define TARGET_SEP_DATA ((target_flags & MASK_SEP_DATA) != 0)
#define TARGET_STACK_CHECK_L1 ((target_flags & MASK_STACK_CHECK_L1) != 0)
#define OPTION_UCLIBC ((linux_uclibc & OPTION_MASK_UCLIBC) != 0)
#define OPTION_GLIBC ((linux_uclibc & OPTION_MASK_UCLIBC) == 0)
#define CL_Treelang (1 << 0)
#define CL_LANG_ALL ((1 << 1) - 1)
enum opt_code
{
OPT_flexer_trace, /* -flexer-trace */
OPT_fparser_trace, /* -fparser-trace */
OPT_mcpu_, /* -mcpu= */
OPT_mcsync_anomaly, /* -mcsync-anomaly */
OPT_mfast_fp, /* -mfast-fp */
OPT_mfdpic, /* -mfdpic */
OPT_mglibc, /* -mglibc */
OPT_mid_shared_library, /* -mid-shared-library */
OPT_minline_plt, /* -minline-plt */
OPT_mleaf_id_shared_library, /* -mleaf-id-shared-library */
OPT_mlong_calls, /* -mlong-calls */
OPT_mlow64k, /* -mlow64k */
OPT_momit_leaf_frame_pointer, /* -momit-leaf-frame-pointer */
OPT_msep_data, /* -msep-data */
OPT_mshared_library_id_, /* -mshared-library-id= */
OPT_msim, /* -msim */
OPT_mspecld_anomaly, /* -mspecld-anomaly */
OPT_mstack_check_l1, /* -mstack-check-l1 */
OPT_muclibc, /* -muclibc */
OPT_v, /* -v */
OPT_y, /* -y */
N_OPTS
};
#endif /* OPTIONS_H */
参考资料
无心插柳-在vs2005中编译GCC4( 2008-1-13 )
gcc交叉编译的实现( 2008-1-25 )
在vs2005下编译gcc:工程文件( 2008-1-30 )
从asm_out_file看gcc汇编代码的生成( 2008-1-30 )
gcc4.1中的machine_mode( 2008-2-1 )
gcc 4.3 configure脚本学习(1):前言( 2008-4-23 )
gcc 4.3 configure脚本学习(2):Be Bourne compatible( 2008-4-24 )
gcc 4.3 configure脚本学习(3):NLS nuisances( 2008-4-24 )
bfin-gcc-4.3.1中config.h的生成( 2008-8-5 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(1):输出注释( 2008-8-5 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(2):Shell检测( 2008-8-5 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(3):文件配置( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(4):帮助信息输出( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(5):参数判断( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(6):子目录获取( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(7):创建临时目录( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(8):配置文件生成( 2008-8-6 )
bfin-xxx-gcc-4.3.1中config.status的生成及运行(9):头文件生成( 2008-8-6 )
bfin-xxx-gcc-4.3.1中auto-host.h的生成( 2008-8-6 )
bfin-xxx-gcc中multilib.h的生成( 2008-8-7 )
bfin-xxx-gcc中tm.h的生成( 2008-8-7 )