diff options
| -rw-r--r-- | src/CompilerKit/src/Compilers/CPlusPlusCompiler+AMD64.cc | 44 | ||||
| -rw-r--r-- | test/test_samples/sample.cc | 6 | ||||
| -rw-r--r-- | test/test_samples/sample.cc.pp | 3 | ||||
| -rw-r--r-- | test/test_samples/sample.kpp | 12 |
4 files changed, 26 insertions, 39 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; diff --git a/test/test_samples/sample.cc b/test/test_samples/sample.cc index 6a6bc44..038f487 100644 --- a/test/test_samples/sample.cc +++ b/test/test_samples/sample.cc @@ -10,7 +10,7 @@ class ostream return void; } - ostream& noop(const ostream in) + ostream& write(const char* buf, const long sz) { return *this; } @@ -18,7 +18,7 @@ class ostream int main() { - void* f = new ostream(); - f->noop(f); + ostream* f = new ostream(); + f->write("foo", 3); return 0; } diff --git a/test/test_samples/sample.cc.pp b/test/test_samples/sample.cc.pp deleted file mode 100644 index 4cce7f6..0000000 --- a/test/test_samples/sample.cc.pp +++ /dev/null @@ -1,3 +0,0 @@ -int main() { - return 0; -} diff --git a/test/test_samples/sample.kpp b/test/test_samples/sample.kpp deleted file mode 100644 index edfab9c..0000000 --- a/test/test_samples/sample.kpp +++ /dev/null @@ -1,12 +0,0 @@ -struct foo -{ - int bar() - { - int y = 0; - return y; - } -}; - -int main() { - return 0; -} |
