coins memo no.4

前回の記事はこちら

coins関係はこちら


まず,コンパイルする環境を整える.

流れとしては

cソース -> coinsで最適化 -> アセンブラ(macならgas)ソース -> gccアセンブルとリンク -> 実行ファイル

となる.で,めんどいのでcoins/classes下にtest_srcディレクトリとtest_logディレクトリを作る.

$ cd coins/classes
$ mkdir test_src test_log

test_srcフォルダにテストに使うファイルを置く事にする.

さらにこんなスクリプトを作る.

# coins/classes/compile.sh

#!/bin/bash
SRCDIR="./test_src"
LOGDIR="./test_log"
COINSLOG="coins.log"
GCCLOG="gcc.log"
ASOUT="asm.s"
OUT="a.out"
SSAOPT="divex"

echo $0 start compile
echo

for i in $@
do
    echo target : $i
    TARGETLOG=$LOGDIR/$(date +%y%m%d-%H%M%S)-$i
    
    if ! mkdir -p $TARGETLOG
    then
	echo mkdir:cannot create the log directory.
	exit 1
    fi
    echo "java coins.driver.Driver -coins:assembler=as,ssa-opt=$SSAOPT,target=x86_64-mac -I../lang/c/include -S -o $ASOUT $SRCDIR/$i &>$TARGETLOG/$ASLOG"
    if ! java coins.driver.Driver -coins:assembler=as,ssa-opt=$SSAOPT,target=x86_64-mac -I../lang/c/include -S -o $ASOUT $SRCDIR/$i &>$TARGETLOG/$COINSLOG
    then
	echo java:compile error
	exit 1
    fi

    echo "gcc -arch x86_64 -lm -o $OUT $ASOUT &>$TARGETLOG/$GCCLOG"
    if ! gcc -arch x86_64 -lm -o $OUT $ASOUT &>$TARGETLOG/$GCCLOG
    then
	echo gcc:compile error
	mv $ASOUT $TARGETLOG/$ASOUT
	exit 1
    fi
    
    mv $OUT $TARGETLOG/$OUT
    mv $ASOUT $TARGETLOG/$ASOUT
    echo $i is done
    echo
done

echo compile was completed

これでとりあえず自動的にログとってコンパイルできる.

その実行はこう../test_srcディレクトリにtest1.cとtest2.cがあるなら,

$ chmod +x compile.sh
$ ./compile.sh test1.c test2.c
./compile.sh start compile

target : test1.c
java coins.driver.Driver -coins:assembler=as,ssa-opt=divex,target=x86_64-mac -I../lang/c/include -S -o asm.s ./test_src/test.c &>./test_log/090118-225300-test1.c/
gcc -arch x86_64 -lm -o a.out asm.s &>./test_log/090118-225300-test1.c/gcc.log
test1.c is done

target : test2.c
java coins.driver.Driver -coins:assembler=as,ssa-opt=divex,target=x86_64-mac -I../lang/c/include -S -o asm.s ./test_src/test.c &>./test_log/090118-225388-test2.c/
gcc -arch x86_64 -lm -o a.out asm.s &>./test_log/090118-225388-test2.c/gcc.log
test2.c is done

compile was completed

こんなかんじ.

出来上がったアセンブラファイルとか実行ファイルはtest_logディレクトリの夫々のディレクトリに移される.

うーん,一旦ここまで.