diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-08 15:22:37 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-08 15:22:37 +0100 |
| commit | dd72dcbd5d07a9b4a2f735765233e2cc5faa7849 (patch) | |
| tree | 5fb62e337761546a2b3d1d949bf9842e3098a070 /src/CompilerKit | |
| parent | 0882b2456b2023f92e90abe1b1cc425bba36712c (diff) | |
chore: adding custom types support.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit')
| -rw-r--r-- | src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc b/src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc index 24bc96f..35d6407 100644 --- a/src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc +++ b/src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc @@ -452,7 +452,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( std::stringstream ss; ss << std::hex << it->second; - syntax_tree.fUserValue = "jmp " + ss.str() + "\n"; + syntax_tree.fUserValue += "jmp " + ss.str() + "\n"; kOrigin += 1UL; } break; @@ -482,7 +482,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( auto mangled_name = nectar_mangle_name(cleanFnName, args); // Generate function label and prologue - syntax_tree.fUserValue = "public_segment .code64 " + mangled_name + "\n"; + syntax_tree.fUserValue += "public_segment .code64 " + mangled_name + "\n"; syntax_tree.fUserValue += nectar_generate_prologue(); // Initialize function-local state @@ -618,13 +618,13 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( if (pairRight != valueOfVar) { if (valueOfVar[0] == '\"') { - syntax_tree.fUserValue = "segment .data64 __NECTAR_LOCAL_VAR_" + varName + ": db " + + syntax_tree.fUserValue += "segment .data64 __NECTAR_LOCAL_VAR_" + varName + ": db " + valueOfVar + ", 0\n\n"; syntax_tree.fUserValue += instr + kRegisterList[kRegisterMap.size() - 1] + ", " + "__NECTAR_LOCAL_VAR_" + varName + "\n"; kOrigin += 1UL; } else { - syntax_tree.fUserValue = + syntax_tree.fUserValue += instr + kRegisterList[kRegisterMap.size() - 1] + ", " + valueOfVar + "\n"; kOrigin += 1UL; } @@ -635,7 +635,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( if (((int) indexRight - 1) < 0) { if (valueOfVar[0] == '\"') { - syntax_tree.fUserValue = + syntax_tree.fUserValue += "segment .data64 __NECTAR_LOCAL_VAR_" + varName + ": db " + valueOfVar + ", 0\n"; syntax_tree.fUserValue += instr + kRegisterList[kRegisterMap.size()] + ", " + "__NECTAR_LOCAL_VAR_" + varName + "\n"; @@ -648,14 +648,14 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( mangled = "__NECTAR_"; mangled += ret; - syntax_tree.fUserValue = "jmp " + mangled + "\n"; + syntax_tree.fUserValue += "jmp " + mangled + "\n"; syntax_tree.fUserValue += instr + " rax, " + kRegisterList[kRegisterMap.size()] + "\n"; goto done; } - syntax_tree.fUserValue = + syntax_tree.fUserValue += instr + kRegisterList[kRegisterMap.size()] + ", " + mangled + "\n"; kOrigin += 1UL; } @@ -668,9 +668,6 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( for (auto pair : kRegisterMap) { if (pair == valueOfVar) goto done; } - - CompilerKit::Detail::print_error("Variable not declared: " + varName, file); - break; } done: @@ -693,12 +690,12 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( CompilerKit::KeywordKind::kKeywordKindType || kKeywords[keyword.second - 1].fKeywordKind == CompilerKit::KeywordKind::kKeywordKindTypePtr) { - syntax_tree.fUserValue = "\n"; + syntax_tree.fUserValue += "\n"; continue; } if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { - syntax_tree.fUserValue = "\n"; + syntax_tree.fUserValue += "\n"; continue; } @@ -744,6 +741,11 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( valueOfVar = "0"; } + if (CompilerKit::STLString::npos == varName.find("*")) + CompilerKit::Detail::print_error("Type not declared: " + varName, file); + + varName = varName.substr(varName.find("*") + 1); + for (auto pair : kRegisterMap) { ++indxReg; @@ -755,13 +757,13 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( ++indexRight; if (pairRight != varName) { - syntax_tree.fUserValue = + syntax_tree.fUserValue += instr + kRegisterList[kRegisterMap.size()] + ", " + valueOfVar + "\n"; kOrigin += 1UL; continue; } - syntax_tree.fUserValue = + syntax_tree.fUserValue += instr + kRegisterList[indexRight - 1] + ", " + valueOfVar + "\n"; kOrigin += 1UL; break; @@ -801,21 +803,21 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( for (auto pair : kRegisterMap) { ++indxReg; - syntax_tree.fUserValue = "mov rax, " + kRegisterList[indxReg - 1] + "\n" + + syntax_tree.fUserValue += "mov rax, " + kRegisterList[indxReg - 1] + "\n" + nectar_generate_epilogue() + "ret\n"; kOrigin += 3UL; // mov + epilogue (2) + ret break; } } else { - syntax_tree.fUserValue = + syntax_tree.fUserValue += "mov rax, " + subText + "\n" + nectar_generate_epilogue() + "ret\n"; kOrigin += 3UL; break; } } else if (!subText.empty()) { - syntax_tree.fUserValue = "__NECTAR_LOCAL_RETURN_STRING: db " + subText + + syntax_tree.fUserValue += "__NECTAR_LOCAL_RETURN_STRING: db " + subText + ", 0\nmov rcx, __NECTAR_LOCAL_RETURN_STRING\n"; syntax_tree.fUserValue += "mov rax, rcx\n" + nectar_generate_epilogue() + "ret\n"; kOrigin += 4UL; // mov rcx + mov rax + epilogue (2) + ret @@ -858,7 +860,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( auto mangled = nectar_mangle_name(funcName); nectar_pop_scope(); - syntax_tree.fUserValue = + syntax_tree.fUserValue += "call " + mangled + "\n" + nectar_generate_epilogue() + "ret\n"; kOrigin += 3UL; break; @@ -876,7 +878,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( std::stringstream ss; ss << std::hex << it->second; - syntax_tree.fUserValue = + syntax_tree.fUserValue += "call " + ss.str() + "\n" + nectar_generate_epilogue() + "ret\n"; kOrigin += 3UL; break; @@ -885,12 +887,12 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendCPlusPlusAMD64::Compile( } } - syntax_tree.fUserValue = nectar_generate_epilogue() + "ret\n"; + syntax_tree.fUserValue += nectar_generate_epilogue() + "ret\n"; kOrigin += 2UL; break; } catch (...) { - syntax_tree.fUserValue = nectar_generate_epilogue() + "ret\n"; + syntax_tree.fUserValue += nectar_generate_epilogue() + "ret\n"; kOrigin += 2UL; break; |
