增加对函数头部和尾部的处理

main
wqz 3 years ago
parent 700f3900d1
commit 69e443ae9e

@ -83,9 +83,36 @@ namespace backend
string CodeGen::prologueCode_gen(Function *func)
{
string code;
/**
*code in here
*/
// if there is callinst in function
bool haveCall = false;
auto bbs = func->getBasicBlocks();
for (auto iter = bbs.begin(); iter != bbs.end(); ++iter)
{
auto bb = iter->get();
for (auto &instr : bb->getInstructions())
{
auto instrType = instr->getKind();
if (instrType == Value::Kind::kCall)
{
haveCall = true;
break;
}
}
}
if (haveCall)
{
// push fp,lr
code += space + "push\t{fp,lr}" + endl;
// set fp
code += space + "add\tfp, sp, #4" + endl;
}
else
{
// push fp
code += space + "push\t{fp}" + endl;
// set fp
code += space + "add\tfp, sp, #0" + endl;
}
return code;
}
@ -98,9 +125,26 @@ namespace backend
string CodeGen::epilogueCode_gen(Function *func)
{
string code;
/**
*code in here
*/
bool haveCall = false;
auto bbs = func->getBasicBlocks();
for (auto iter = bbs.begin(); iter != bbs.end(); ++iter)
{
auto bb = iter->get();
for (auto &instr : bb->getInstructions())
{
auto instrType = instr->getKind();
if (instrType == Value::Kind::kCall)
{
haveCall = true;
break;
}
}
}
if (haveCall)
code += space + "pop\t{fp,lr}" + endl;
else
code += space + "pop\t{fp}" + endl;
code += space + "bx\t" + endl;
return code;
}
@ -327,7 +371,7 @@ namespace backend
{
asmCode += space + ".data" + endl;
//******************Revised by lyq BEGIN***************************************
if(glbvl->isconst())
if (glbvl->isconst())
asmCode += space + ".section" + space + "rodata" + endl;
//******************Revised by lyq END*****************************************
{
@ -349,7 +393,7 @@ namespace backend
{
asmCode += space + ".bss" + endl;
//******************Revised by lyq BEGIN***************************************
if(glbvl->isconst())
if (glbvl->isconst())
asmCode += space + ".section" + space + "rodata" + endl;
//******************Revised by lyq END*****************************************
{

Loading…
Cancel
Save