Minor fixes for the linux assembler
This commit is contained in:
parent
84c5c9f4f2
commit
c11e0792f4
|
@ -734,6 +734,8 @@ static void AsGlobalSymbol(struct SymbolTableEntry* Entry) {
|
||||||
fprintf(OutputFile,"\t.globl\t%s\n", Entry->Name);
|
fprintf(OutputFile,"\t.globl\t%s\n", Entry->Name);
|
||||||
fprintf(OutputFile, "%s:\n", Entry->Name);
|
fprintf(OutputFile, "%s:\n", Entry->Name);
|
||||||
|
|
||||||
|
printf("%s, %d\n", Entry->Name, Entry->Length);
|
||||||
|
|
||||||
for (i = 0; i < Entry->Length; i++) {
|
for (i = 0; i < Entry->Length; i++) {
|
||||||
init = 0;
|
init = 0;
|
||||||
if (Entry->InitialValues != NULL)
|
if (Entry->InitialValues != NULL)
|
||||||
|
@ -780,13 +782,10 @@ static int AsCall(struct SymbolTableEntry* Entry, int Args) {
|
||||||
printf("\t\t\tFunction returns into %s\n", Registers[OutRegister]);
|
printf("\t\t\tFunction returns into %s\n", Registers[OutRegister]);
|
||||||
|
|
||||||
// Allocate shadow space
|
// Allocate shadow space
|
||||||
fprintf(OutputFile, "\taddq\t$-32, %%rsp\n");
|
|
||||||
fprintf(OutputFile, "\tcall\t%s\n", Entry->Name);
|
fprintf(OutputFile, "\tcall\t%s\n", Entry->Name);
|
||||||
// Deallocate arguments and stack space.
|
// Deallocate arguments and stack space.
|
||||||
if (Args > 4)
|
if (Args > 6)
|
||||||
fprintf(OutputFile, "\taddq\t$%d, %%rsp\n", (8 * (Args - 4)) + 32);
|
fprintf(OutputFile, "\taddq\t$%d, %%rsp\n", 8 * (Args - 6));
|
||||||
else
|
|
||||||
fprintf(OutputFile, "\taddq\t$32, %%rsp\n");
|
|
||||||
|
|
||||||
fprintf(OutputFile, "\tmovq\t%%rax, %s\n", Registers[OutRegister]);
|
fprintf(OutputFile, "\tmovq\t%%rax, %s\n", Registers[OutRegister]);
|
||||||
|
|
||||||
|
@ -1020,11 +1019,11 @@ static void AsFunctionPreamble(struct SymbolTableEntry* Entry) {
|
||||||
if (ParamCount > 6) { // We only have 6 argument registers
|
if (ParamCount > 6) { // We only have 6 argument registers
|
||||||
Param->SinkOffset = ParamOffset;
|
Param->SinkOffset = ParamOffset;
|
||||||
ParamOffset += 8;
|
ParamOffset += 8;
|
||||||
|
} else {
|
||||||
|
Entry->SinkOffset = AsCalcOffset(Param->Type);
|
||||||
|
AsStrLocalVar(Param, ParamReg--);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Entry->SinkOffset = AsCalcOffset(Param->Type);
|
|
||||||
AsStrLocalVar(Param, ParamReg--);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we have more parameters, move them to the stack
|
// If we have more parameters, move them to the stack
|
||||||
for (Local = Locals; Local != NULL; Local = Local->NextSymbol) {
|
for (Local = Locals; Local != NULL; Local = Local->NextSymbol) {
|
||||||
|
@ -1032,7 +1031,7 @@ static void AsFunctionPreamble(struct SymbolTableEntry* Entry) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// With all the parameters on the stack, we can allocate the shadow space
|
// With all the parameters on the stack, we can allocate the shadow space
|
||||||
StackFrameOffset = ((LocalVarOffset + 31) & ~31);
|
StackFrameOffset = ((LocalVarOffset + 15) & ~16);
|
||||||
fprintf(OutputFile,
|
fprintf(OutputFile,
|
||||||
"\taddq\t$%d, %%rsp\n", -StackFrameOffset);
|
"\taddq\t$%d, %%rsp\n", -StackFrameOffset);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import "tests/print.em"
|
import "print.em"
|
||||||
|
|
||||||
int :: main () {
|
int :: main () {
|
||||||
printf("%s\r\n", "hi there");
|
printf("%s\r\n", "hi there");
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import "tests/print.em"
|
import "import/defs.eh"
|
||||||
|
|
||||||
int stuff[] = { 5, 7, 9 };
|
int stuff[] = { 5, 7, 9 };
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user