Пример #1
0
int main(int argc, char **argv)
{
	int i;
	char buf[1024];

	if (argc == 1) {
		while(!feof(stdin)) {
			fgets(buf, 1023, stdin);
			if (feof(stdin)) break;
			buf[strlen(buf)-1] = '\0';
			if (!rax(buf)) break;
		}
		return 0;
	}
	if (argv[1][0]=='-') {
		switch(argv[1][1]) {
		case 'h':
			printf("Usage: rax2 [-hV] [expression]\n");
			return 0;
		case 'V':
			printf("rax2 v"VERSION"\n");
			return 0;
		}
	}
	for(i=1; i<argc; i++)
		rax( argv[i] );
	return 0;
}
        CCode GenerateFunctionFinalCode(CCode& code, CFunctionGenerateArg& fgArg, const std::string& funcName )
        {
            std::set<CTemp*, CTempCompare> argsSet;
            std::vector<CTemp*> argsInReg;
            std::vector<CTemp*> mappedArgs;
            std::set<CTemp*, CTempCompare> usedRegsSet;
            CTempPtr rax(new CTemp(storage.Get("rax")));

            for( auto& p : fgArg.tempMap ) {
                if( *p.second != *rax.get() ) {
                    usedRegsSet.insert(p.second);
                }
            }

            std::vector<CTemp*> usedRegs(usedRegsSet.begin(), usedRegsSet.end());

            for( int i = 0; i < fgArg.args.size(); i++ ) {
                auto& arg = fgArg.args[i];
                argsSet.insert(arg.get());
                if( fgArg.onStack.find(arg.get()) == fgArg.onStack.end() ) {
                    argsInReg.push_back(arg.get());
                    mappedArgs.push_back(fgArg.tempMap[arg.get()]);
                } else {
                    argsInReg.push_back(nullptr);
                    mappedArgs.push_back(nullptr);
                    int ind = static_cast<int>(fgArg.args.size() - i - 1);
                    std::string str = std::to_string((ind) * 8 + 16) + "(%rbp)";
                    fgArg.addedTemps.emplace_back(new Temp::CTemp(storage.Get(str)));
                    fgArg.tempMap[arg.get()] = fgArg.addedTemps.back().get();
                }
            }

            int nextVarInd = 0;
            for( auto& p : fgArg.tempMap ) {
                if( fgArg.onStack.find(p.first) != fgArg.onStack.end() ) {
                    if( argsSet.find(p.first) == argsSet.end()) {
                        std::string str = std::to_string(-nextVarInd * 8) + "(%rbp)";
                        fgArg.addedTemps.emplace_back(new Temp::CTemp(storage.Get(str)));
                        p.second = fgArg.addedTemps.back().get();
                        nextVarInd++;
                    }
                }
            }

            CCode resCode;
            resCode.emplace_back(new LABEL(IRTree::LabelPtr(new Temp::CLabel(storage.Get(funcName)))));
            auto prolog = FunctionPrologue(fgArg.args.size(), usedRegs, argsInReg, mappedArgs);
            for( auto& inst : prolog ) {
                resCode.push_back(inst);
            }

            for( auto& op : code ) {
                resCode.push_back(op);
            }
            auto epilog = FunctionEpilogue(fgArg.args.size(), usedRegs);
            for( auto& inst : epilog ) {
                resCode.push_back(inst);
            }
            return resCode;

        }