Giter Club home page Giter Club logo

compiler_project's Introduction

compiler_project

This is the compiler project release repo for the SOFT130061 @ Fudan University.

compiler_project's People

Contributors

idlebo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

compiler_project's Issues

关于生成的树和参考树的问题

老师好,我在测试的时候,第二个bin_search出错了,但是我仔细看一遍,我的树和参考树是一模一样的(至少肉眼看上去),我想问一下我们应该怎么判断两个文件是不是一样的

debug可执行文件时出现段错误

我debug的可执行文件时public文件夹下的sort_test7,在执行这个文件的时候出现了段错误。经过我debug,发现该错误出现在该文件的tea代码中MergeSort函数在if循环中第一次调用自身这个位置。我把生成的汇编代码仔仔细细的看了一遍,并把大部分过程中目标寄存器的值进行了注释标注,发现实际运行逻辑并没有问题,但是问题出现段错误的地方是第一次调用自身的ldp x29, x30, [sp], #16 这个地方。下面我给出对应该函数的汇编代码,并给出gdb的调试出现错误的位置:

(gdb)  x/10i $pc
=> 0x400c30 <bb25+88>:  ldp     x29, x30, [sp], #16
   0x400c34 <bb25+92>:  ldr     x15, [sp], #8
   0x400c38 <bb25+96>:  ldp     x13, x14, [sp], #16
   0x400c3c <bb25+100>: ldp     x11, x12, [sp], #16
   0x400c40 <bb25+104>: ldp     x9, x10, [sp], #16
   0x400c44 <bb25+108>: mov     x9, x0
   0x400c48 <bb25+112>: mov     x9, x13
   0x400c4c <bb25+116>: mov     x10, #0x1                       // #1
   0x400c50 <bb25+120>: add     x9, x9, x10
   0x400c54 <bb25+124>: mov     x10, x9
MergeSort:

        //bb24:

bb24:

        //  %r390 = add i32 0, 0

        mov     x16, #0
        sub     sp, sp, x16
        mov     x12, x0 //array
        mov     x11, x1 //p
        mov     x10, x2 //q
        mov     x9, #0
        mov     x13, x9
        //  %r391 = add i32 0, 0

        mov     x9, #0
        mov     x15, x9
        //  %r392 = add i32 0, 0

        mov     x9, #0
        //  %r393 = add i32 %r241, 0

        mov     x11, x11
        //  %r394 = add i32 0, 0

        mov     x9, #0
        //  %r395 = add i32 %r243, 0

        mov     x14, x10
        //  %r247 = add i32 %r393, 0

        mov     x9, x11
        //  %r249 = add i32 %r395, 0

        mov     x10, x14
        //  %r245 = icmp slt i32 %r247, %r249

        cmp     x9, x10
        //  br i1 %r245, label %bb25, label %bb26


        b.lt     bb25
        b     bb26
        //bb25:

bb25:

        //  %r252 = add i32 %r393, 0

        mov     x9, x11 //p
        //  %r254 = add i32 %r395, 0

        mov     x10, x14 //q
        //  %r255 = add i32 %r252, %r254

        add     x9, x9, x10 //p+q
        //  %r256 = sdiv i32 %r255, 2

        mov     x10, #2
        sdiv     x9, x9, x10 //(p+q)/2
        //  %r398 = add i32 %r256, 0

        mov     x13, x9 //(p+q)/2
        //  %r261 = getelementptr i32, i32* %r240, i32 0

        mov     x9, #0
        mov     x10, #8
        mul     x9, x9, x10
        add     x9, x12, x9 //array
        //  %r263 = add i32 %r393, 0

        mov     x10, x11        //p        
        //  %r265 = add i32 %r398, 0

        mov     x15, x13 //(p+q)/2
        //  %r259 = call i32 @MergeSort(i32* %r261, i32 %r263, i32 %r265)

        mov     x0, x9
        mov     x1, x10
        mov     x2, x15
        stp     x9, x10, [sp, #-16]!
        stp     x11, x12, [sp, #-16]!
        stp     x13, x14, [sp, #-16]!
        str     x15, [sp, #-8]!
        stp     x29, x30, [sp, #-16]!
        mov     x29, sp
        bl     MergeSort
        ldp     x29, x30, [sp], #16                  //在此处出现了段错误
        ldr     x15, [sp], #8
        ldp     x13, x14, [sp], #16
        ldp     x11, x12, [sp], #16
        ldp     x9, x10, [sp], #16
        mov     x9, x0  //return value ,is 0
        //  %r399 = add i32 %r259, 0

        //  %r267 = add i32 %r398, 0

        mov     x9, x13 //(p+q)/2
        //  %r268 = add i32 %r267, 1

        mov     x10, #1
        add     x9, x9, x10 //(p+q)/2+1
        //  %r400 = add i32 %r268, 0

        mov     x10, x9     //(p+q)/2+1
        //  %r272 = getelementptr i32, i32* %r240, i32 0

        mov     x9, #0  
        mov     x15, #8
        mul     x9, x9, x15
        add     x15, x12, x9 //array
        //  %r274 = add i32 %r400, 0

        mov     x10, x10
        //  %r276 = add i32 %r395, 0

        mov     x9, x14 //q
        //  %r270 = call i32 @MergeSort(i32* %r272, i32 %r274, i32 %r276)

        mov     x0, x15 //array
        mov     x1, x10 //(p+q)/2+1 = tmp
        mov     x2, x9  //q
        stp     x9, x10, [sp, #-16]!
        stp     x11, x12, [sp, #-16]!
        stp     x13, x14, [sp, #-16]!
        str     x15, [sp, #-8]!
        stp     x29, x30, [sp, #-16]!
        mov     x29, sp
        bl     MergeSort
        ldp     x29, x30, [sp], #16
        ldr     x15, [sp], #8
        ldp     x13, x14, [sp], #16
        ldp     x11, x12, [sp], #16
        ldp     x9, x10, [sp], #16
        mov     x9, x0
        //  %r401 = add i32 %r270, 0

        //  %r280 = getelementptr i32, i32* %r240, i32 0

        mov     x9, #0
        mov     x10, #8
        mul     x9, x9, x10
        add     x12, x12, x9
        //  %r282 = add i32 %r393, 0

        mov     x11, x11
        //  %r284 = add i32 %r398, 0

        mov     x10, x13
        //  %r286 = add i32 %r395, 0

        mov     x9, x14
        //  %r278 = call i32 @Merge(i32* %r280, i32 %r282, i32 %r284, i32 %r286)

        mov     x0, x12
        mov     x1, x11
        mov     x2, x10
        mov     x3, x9
        stp     x9, x10, [sp, #-16]!
        stp     x11, x12, [sp, #-16]!
        stp     x13, x14, [sp, #-16]!
        str     x15, [sp, #-8]!
        stp     x29, x30, [sp, #-16]!
        mov     x29, sp
        bl     Merge
        ldp     x29, x30, [sp], #16
        ldr     x15, [sp], #8
        ldp     x13, x14, [sp], #16
        ldp     x11, x12, [sp], #16
        ldp     x9, x10, [sp], #16
        mov     x9, x0
        //  %r402 = add i32 %r278, 0

        mov     x9, x9
        //  br label %bb27


        b     bb27
        //bb26:

bb26:

        //  br label %bb27


        b     bb27
        //bb27:

bb27:

        //  %r396 = phi i32 [ %r402, %bb25 ], [ %r390, %bb26 ]

        //  %r397 = phi i32 [ %r398, %bb25 ], [ %r391, %bb26 ]

        //  ret i32 0

        mov     x9, #0
        mov     x0, x9
        mov     sp, x29
        ret

.out文件内容错误的debug方法

成功生成了.ll文件,也过了llvm-link-14的语法检查,但是生成的.out和给出的.out内容不一样,应该怎么debug,因为实现逻辑不太一样,所以很难和原来给出的.ll文件进行逐行比对
image

关于mem2reg的设计思路的猜测

mem2reg要做的是消除所有的alloca、store、load指令,这是通过首先找到所有alloca指令,记录对应的操作数,并生成一个新的操作数(int寄存器形式),然后遍历所有块,找到一个alloca、store、load指令就替换成move指令。

我的理解是这样的,但是我不清楚“并记录向该地址存取的标量”的意思,而且其实按照助教提供的思路好像load指令不能直接删除,还是需要load指令,因为原先的指令序列中load指令的dst会在后续指令中用到。想问一下上面的理解是否正确。

关于Assignment1(生成AST)的几个问题

老师好,关于pj有两个问题

  1. 在teapl中keyword是否是大小写敏感的,因为一般C/C++中的关键字是非大小写敏感的。我们是否需要考虑这一点
  2. 是否需要完成error handling的工作,比如识别到不支持的字符时输出error message

关于变量定义和声明的问题

请问变量可以定义后重复声明吗,以及变量允许在外部定义然后在内部声明吗(感觉描述有点混用变量的定义和声明?)

关于文件不可识别的问题

在make后,发现sylib/sylib.o文件没法正常识别,导致编译出错,使用file命令发现该文件的arch未知。请问这个问题应该如何解决?

环境是wsl

image

sylib/sylib.o 文件格式问题

make之后终端输出如下,显示
sylib/sylib.o: file not recognized: file format not recognized
是我aarch64-linux-gnu-gcc和qemu-aarch64的问题吗?还是sylib.o的问题

屏幕截图 2024-06-11 163657

关于spill部分的实现

74a018e623c32bdf6678aa5eb059717

关于这部分我的想法是这样的,不知道正确与否:

  1. 需要先计算为spill额外开辟多少栈空间,然后对于每一个虚拟寄存器,偏移量分别是多少。
  2. 然后对之后每次用到这个虚拟寄存器的地方分配一个spill专用的物理寄存器,use的话ldr到这个寄存器中,def的话通过这个寄存器再str到栈上,这些指令直接加到对应指令的附近。

但是这样的话栈空间的开辟应该插入到哪个位置呢?

lab5关于配置环境问题

已经按照env_setup.md文件中的步骤成功的配置了环境,在make之后出现了下面的问题:
image
看make的执行应该是写的有问题,但是在bit_int_mul下面的一行不知道是什么错误,用gdb调试的时候还是可以正常运行的。
根据ChatGPT提供的帮助,设置了环境变量。我的ld-linux-aarch64.so.1具体路径如下:
image
在设置了环境变量之后make,运行结果如下:
image
第二种情况直接段错误了,用gdb调试确实正常运行?
image
不知道这种问题如何解决

关于 "llegal input " 提示

部分测试用例在pass前会有 "llegal input " 的提示,目前没有找到原因。
屏幕截图 2024-06-09 174614
但是查看输出的话确实是正确的,也能够pass测试用例。请问这个 "llegal input " 的提示会对评分有影响吗?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.