From ae32334ccc429816a9ce5418142bd7518a455813 Mon Sep 17 00:00:00 2001 From: ridethepig Date: Mon, 8 May 2023 22:58:12 +0800 Subject: [PATCH] compile and link on x86 --- .gitignore | 3 +- scripts/compiler.py | 35 ++++++++++++--- scripts/tester.py | 15 ++++++- tools/sylib/libsysy.a | Bin 0 -> 5648 bytes tools/sylib/libsysy_x86.a | Bin 0 -> 9616 bytes tools/sylib/sylib.c | 89 ++++++++++++++++++++++++++++++++++++++ tools/sylib/sylib.h | 26 +++++++++++ 7 files changed, 158 insertions(+), 10 deletions(-) create mode 100644 tools/sylib/libsysy.a create mode 100644 tools/sylib/libsysy_x86.a create mode 100644 tools/sylib/sylib.c create mode 100644 tools/sylib/sylib.h diff --git a/.gitignore b/.gitignore index 3c73ba5..50c5e73 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ .antlr/ *.log -__pycache__/ \ No newline at end of file +__pycache__/ +*.o \ No newline at end of file diff --git a/scripts/compiler.py b/scripts/compiler.py index 5398107..7cd0b36 100644 --- a/scripts/compiler.py +++ b/scripts/compiler.py @@ -2,8 +2,8 @@ import os import subprocess from pretty_print import Print_C -lib = "build/lib/libsysy.a" -header = "build/include/sylib.h" +lib = "tools/sylib/libsysy_x86.a" +header = "tools/sylib/sylib.h" class Compiler: def __init__(self, scheme, testcases): @@ -78,7 +78,11 @@ class Compiler: log_file = open(log, "a+") Print_C.print_procedure(f"Generating {self.scheme}.s") - subprocess.run(f"llc -O3 -march=arm -mcpu=cortex-a72 -float-abi=hard -filetype=asm {ir} -o {asm}".split(), stdout=log_file, stderr=log_file, bufsize=1) + # subprocess.run(f"llc -O3 -march=arm -mcpu=cortex-a72 -float-abi=hard -filetype=asm {ir} -o {asm}".split(), stdout=log_file, stderr=log_file, bufsize=1) + completed = subprocess.run(f"llc -O3 --relocation-model=pic {ir} -o {asm}".split(), stdout=log_file, stderr=log_file, bufsize=1) + if completed.returncode != 0: + Print_C.print_error(f"Generating {self.scheme}.s failed! See {log} | {ir}") + self.count_error += 1 log_file.close() @@ -91,8 +95,11 @@ class Compiler: log_file = open(log, "a+") Print_C.print_procedure(f"Generating {self.scheme}.o") - subprocess.run(f"as -march=armv7-a -mfloat-abi=hard {asm} -o {obj}".split(), stdout=log_file, stderr=log_file, bufsize=1) - + # subprocess.run(f"as -march=armv7-a -mfloat-abi=hard {asm} -o {obj}".split(), stdout=log_file, stderr=log_file, bufsize=1) + completed = subprocess.run(f"as {asm} -o {obj}".split(), stdout=log_file, stderr=log_file, bufsize=1) + if completed.returncode != 0: + Print_C.print_error(f"Generating {self.scheme}.o failed! See {log}") + self.count_error += 1 log_file.close() def obj_to_bin(self, testcase): @@ -103,8 +110,11 @@ class Compiler: log_file = open(log, "a+") Print_C.print_procedure(f"Generating {self.scheme}") - subprocess.run(f"clang -Ofast -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard {obj} {lib} -o {bin}".split(), stdout=log_file, stderr=log_file, bufsize=1) - + # subprocess.run(f"clang -Ofast -marm -march=armv7-a -mfpu=neon -mfloat-abi=hard {obj} {lib} -o {bin}".split(), stdout=log_file, stderr=log_file, bufsize=1) + completed = subprocess.run(f"clang -Ofast -fPIE {obj} {lib} -o {bin}".split(), stdout=log_file, stderr=log_file, bufsize=1) + if completed.returncode != 0: + Print_C.print_error(f"Linking {self.scheme} failed! See {log}") + self.count_error += 1 log_file.close() @@ -148,5 +158,16 @@ class Compiler: if self.count_error >= 1: Print_C.print_error(f"Test script stopped due to too many errors") return + + def compile_reference(self, frontend_instr, category): + for testcase in self.testcases: + Print_C.print_subheader(f"[Compiling {self.scheme} | {testcase}]") + self.sy_to_ir(frontend_instr=frontend_instr, testcase=testcase, category=category) + self.ir_to_asm(testcase=testcase) + self.asm_to_obj(testcase=testcase) + self.obj_to_bin(testcase=testcase) + if self.count_error >= 1: + Print_C.print_error(f"Test script stopped due to too many errors") + return \ No newline at end of file diff --git a/scripts/tester.py b/scripts/tester.py index 8fed9f7..d1aabcb 100644 --- a/scripts/tester.py +++ b/scripts/tester.py @@ -36,6 +36,9 @@ class Tester: def compile_rubbish(self, category): self.compiler.compile_rubbish(frontend_instr=self.frontend_instr, category=category) + + def compile_reference(self, category): + self.compiler.compile_reference(frontend_instr=self.frontend_instr, category=category) def run(self): self.runner.run_all_tests() @@ -84,6 +87,12 @@ my_scheme = {"scheme": "my", "frontend_instr": my_compiler + " -S {sy} -o {ir}", "emit_llvm_ir": False} +llir_scheme = {"scheme": "llir", + "frontend_instr": "clang -x c -c -fPIE -S -emit-llvm -include {header} {sy} -o {ir}", + "emit_llvm_ir": True} + +# gcc -c -fPIC -o sylib.o -include sylib.h sylib.c && ar rcs libsysy_x86.a sylib.o + # ustc_ustc_scheme = {"scheme": "ustc_ustc", # "frontend_instr": ustc_compiler + "-o {asm} {sy}", # "emit_llvm_ir": False} @@ -103,7 +112,8 @@ my_scheme = {"scheme": "my", if __name__ == '__main__': - testcases = get_sy_testcases(sub_dir="functional_test") + category = "functional" + testcases = get_sy_testcases(sub_dir=category) all_schemes = [clang_llvm_scheme, thu_llvm_scheme, thu_thu_scheme] # gcc_gcc_scheme, ustc_ustc_scheme, ustc_ustc_no_vec_scheme] testers = [] Print_C.print_header("[Removing old data...]\n\n") @@ -113,7 +123,8 @@ if __name__ == '__main__': subprocess.run("rm -rf build/log/run_log".split()) subprocess.run("rm -rf build/log/test_result.log".split()) - Tester(my_scheme, True, testcases).compile_rubbish(category="functional_test") + # Tester(my_scheme, True, testcases).compile_rubbish(category=category) + Tester(llir_scheme, True, testcases).compile_reference(category=category) # for scheme in all_schemes: # tester = Tester(scheme, is_trivial=True) diff --git a/tools/sylib/libsysy.a b/tools/sylib/libsysy.a new file mode 100644 index 0000000000000000000000000000000000000000..85780e5ed4b22667ee04b41bd41d524c9843884d GIT binary patch literal 5648 zcmcIoU2GHC6~1F9Aq;;ZgeGx9cZ?HiL*h6;OCUxi367Jn4gnHSSYXE!|1cvQJGIBF z{8Vjr7ipJjAK3m#D|o0>RjSk%(yFLW2p%f6>S`s#s!~;|3aM4Ks%XX1E_Ly?^gDNE zoUwt;KD1Yw`R;elx#ymH@0mMu$9+i2#?-HhT~c`o*r-vr-zBMMe~)Pq6&YhY7!!{E zuP!;am|K){x{}qIQBS1fW-ZliReH>dYT}%UITQ0%MT;-63kh9I>jW{C?n*YREVB7L zmjWQg-H^^El9_Bmo>R0mQ<8cjYgBDf>DpYv>P^qgbINjyDQ(uDDNW>yW^jLBAD_9t zzJO^G6~8$W2@8UNi8PA9yljmzwz`$etNS>3SsmNPuH1NQm0jNw`Fd!}D}S76QJ15^ zaC3OmE6bs#@Y8?(=V?%F3fDlhq_(J6hlM*N+uVOMeB~y)6)^kp0-yC$Y_Is1(%!?dtH~ z?iH=rwYAt=&DdWxV?PcYz_oJYP2TUKT2=DKZq>qi<>qFaenF)furw<-F7Z|eql;?Y zT02iMy5)XRy~YL*UyIrt7E8LKD)bhkPt;}1=3noLlHsk6_Y*=tG^Z;+qcw4(4comG z?Y#fe(W^6c;U$&12MfFFTEVu1oj~1XYDnH_lkc?2>uvHnn|w(XdX}O~>Q6si$$WTE zJbG=$6&5@@qU;u}@A*R2^86^fwSst_S03KDyjper0#-@DXn%A+fwkJD(%lsSdK<*?6spmzzCku2&8l4%1mweU+VFKyYAI7Y35S6pq?v8%z4G}p73qfrP;~zNBUg~y9^kh7%e?e*O%G%(>e%DUj$b`~$MIItQSS8{NY_w3m5sa}VxyJv4C-Mus$V>nF⪻kru-wM{GZo|Eq-*>4b zX;HVrbG=IQv@a}%w_u)(d}_c7KD_z9{o#MkBF>unBy?8(Q>Kc@l6qAfKZBK7R4KQZ zdjs;r*b%JUXSeoL_*^xgp(SJmb1zZMeAO0stP6;h@^+};k#sK6Awj0pWx!l&mdoza zx_GcIPA6tngY2y83SH!Q*OlZpVkn8MAwRR6#|=O1HO^$ytF_{96rG-{4Ieb#b)DvV zM`*@uP1)38)_rbv?SuW1f+SI9wWxc|es^=${yF^`dE^M~GW*@hTQr+3>eua;@{Ic3 zz}pGE)o4L`1nrEgcnAD>ogAYSX^-QI5e_g3WEwBN>|lGKFWyPF0m#NW+v5|srf}tR z_!gL+oF0liS7S@M(IZC&B=4!&d|J}M zjg^Elt1*FITGjoXL##&JFjOmSbcj{;RSm*Uq0!kSGz%_AtMKKT-Or59E~sLkJher` zoMmrY2JW=0!Kx~FHQQJwsb=)9St|n9A1Vn1t{<~;YJbVbsr?ljCw;-jNncwUgyFx< z#!2tBaccjrjg$VnHcooUfg3L+1!qoHQ!&089{&NGJ+=RRX__kA*H*NzLD*bP=6daw5K0?=u6TNK%C3m&BwzEf1TPk?F$?-A8_5KRpU%?Mo z@X-oBS;1#aPBBpbvp^aJ$+4y>gi{dw+f4?^I0U_)QK(hY~NPcOl$ez}hun8!3Ge&z8 z@gCy6j2$=SDHB&rIqgwocf~~7lgNJ?(DfDUX@vM-=^$*!_z2q=>m&3s_G6%khxHEj zB0}1esQrDQ>i}baBHYc`$Alin9uT7aLqhob2O<0y2+`kXK#GSp5At6HB<=@_IB*;S zlK(+dA0mYRF+z#4D3I)E?;^Vp(B+1n5dI>B9?SnEOsz~ZsY z+*|^OWPduNC;X$wPIdAJf%%6{PWTmF&uX)IJ&`ja`C|8%V1{MI+r%hzevMlMbxaj6 zv^Vqp-sGXpjQti3w}4Z7va7{~Y2h48#LN3OUnC$~Do9gqzn)zHcGLzb#0&YGFzWMc!9q$*x2W#&E}8%TK;BG zr*Y7Ds62!}Jc6Y{I=U1SErol7RWp!msC*3j#H?qScTq>3wp*44;oQB@WST@@UC)Jdu=S zdFo7Ld{`cnMGv@^PS{1FM@z?2`FP?Gwqh;g$1gIwM9E$#7cJ(xXlEv2*IsEnjlW6K z9x0R8sglg6W4e|}=cK(|BKCL5_#Nf-b?_fj2J)xUOIqdZd0$X`J)^}Xw1&ix`Z~a3 zs*S8QNq4L@v_=E#q&GRIcSwG}-zOPw7DFJ*r-$UBlcQ6z?322>r0L1f-#}~eq zzEFx-(&pw<3ECDE8UV$QO+nXU61JRtOqXcTuPZ6ZdKuwO)lvFq7c9*ze{Ykm*Jn57 z5?PLn9~(g=Hf!UZ2IG>oDS6fy%Q$sLJ|=Ysdit#3Xfli_Qr%}wgY#xwsh*M~_^iEJ zQg)ag=GG+UAS(s=TuJgAkNEu<6lJ-zfqK0$WCEYPOxEX<_&VGEIeL9TsoXxEs5D>u iEeUHQQ)~;sXO*TPg``erDlN>JEHe;2_{FLvMe)CG3j;X- literal 0 HcmV?d00001 diff --git a/tools/sylib/libsysy_x86.a b/tools/sylib/libsysy_x86.a new file mode 100644 index 0000000000000000000000000000000000000000..8a5af1dbe16b368708ddd1b79951db29b8785a7d GIT binary patch literal 9616 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 literal 0 HcmV?d00001 diff --git a/tools/sylib/sylib.c b/tools/sylib/sylib.c new file mode 100644 index 0000000..717e8fe --- /dev/null +++ b/tools/sylib/sylib.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include"sylib.h" +struct timeval _sysy_start,_sysy_end; + +int _sysy_l1[_SYSY_N],_sysy_l2[_SYSY_N]; +int _sysy_h[_SYSY_N], _sysy_m[_SYSY_N],_sysy_s[_SYSY_N],_sysy_us[_SYSY_N]; +int _sysy_idx; + +/* Input & output functions */ +int getint(){int t; scanf("%d",&t); return t; } +int getch(){char c; scanf("%c",&c); return (int)c; } +float getfloat(){ + float n; + scanf("%a", &n); + return n; +} + +int getarray(int a[]){ + int n; + scanf("%d",&n); + for(int i=0;i +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +/* Input & output functions */ +int getint(),getch(),getarray(int a[]); +void putint(int a),putch(int a),putarray(int n,int a[]); +// #define putf(fmt, ...) printf(fmt, __VA_ARGS__) // TODO? +/* Timing function implementation */ +#define starttime() _sysy_starttime(__LINE__) +#define stoptime() _sysy_stoptime(__LINE__) +#define _SYSY_N 1024 + +__attribute((constructor)) void before_main(); +__attribute((destructor)) void after_main(); +void _sysy_starttime(int lineno); +void _sysy_stoptime(int lineno); +#ifdef __cplusplus +} +#endif +#endif