diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index d9b5194..e06d831 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -131,29 +131,17 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr state } void ModuleBuilder::buildRawFunction(shared_ptr statement) { - // get argument types - vector types; + // function types + llvm::Type *returnType = typeForValueType(statement->getReturnValueType()); + vector argTypes; + for (pair> &arg : statement->getArguments()) + argTypes.push_back(typeForValueType(arg.second)); - llvm::FunctionType *funType = llvm::FunctionType::get(llvm::Type::getVoidTy(*context), types, false); + // function declaration & body + llvm::FunctionType *funType = llvm::FunctionType::get(returnType, argTypes, false); llvm::InlineAsm *rawFun = llvm::InlineAsm::get(funType, statement->getRawSource(), statement->getConstraints(), false, false, llvm::InlineAsm::AsmDialect::AD_Intel); if (!setRawFun(statement->getName(), rawFun)) return; - - /*int res; - int a = 42; - int b = 13; - - vector types; - types.push_back(typeSint32); - types.push_back(typeSint32); - llvm::FunctionType *asmType = llvm::FunctionType::get(typeSint32, types, false); - llvm::InlineAsm *asmm = llvm::InlineAsm::get(asmType, "add $0, $1", "+{ebx},i", false, false, llvm::InlineAsm::AsmDialect::AD_Intel); - - vectorargValues; - argValues.push_back(llvm::ConstantInt::get(typeSint32, 5, true)); - argValues.push_back(llvm::ConstantInt::get(typeSint32, 4, true)); - - llvm::Value *valu = builder->CreateCall(asmm, llvm::ArrayRef(argValues));*/ } void ModuleBuilder::buildVarDeclaration(shared_ptr statement) { diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 54c4e1f..c012bf6 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -241,6 +241,8 @@ shared_ptr Parser::matchStatementRawFunction() { string name; string constraints; + vector>> arguments; + shared_ptr returnType = ValueType::NONE; string rawSource; // name @@ -260,6 +262,10 @@ shared_ptr Parser::matchStatementRawFunction() { markError({TokenKind::GREATER}, {}); } + // arguments + + // return type + // consume new line if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) { markError(TokenKind::NEW_LINE, {}); @@ -281,7 +287,7 @@ shared_ptr Parser::matchStatementRawFunction() { return nullptr; } - return make_shared(name, constraints, rawSource); + return make_shared(name, constraints, arguments, returnType, rawSource); } shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds) { diff --git a/src/Parser/Statement/StatementRawFunction.cpp b/src/Parser/Statement/StatementRawFunction.cpp index 5369a42..6417c6a 100644 --- a/src/Parser/Statement/StatementRawFunction.cpp +++ b/src/Parser/Statement/StatementRawFunction.cpp @@ -1,7 +1,7 @@ #include "StatementRawFunction.h" -StatementRawFunction::StatementRawFunction(string name, string constraints, string rawSource): -Statement(StatementKind::RAW_FUNCTION), name(name), constraints(constraints), rawSource(rawSource) { } +StatementRawFunction::StatementRawFunction(string name, string constraints, vector>> arguments, shared_ptr returnValueType, string rawSource): +Statement(StatementKind::RAW_FUNCTION), name(name), constraints(constraints), arguments(arguments), returnValueType(returnValueType), rawSource(rawSource) { } string StatementRawFunction::getName() { return name; @@ -11,6 +11,14 @@ string StatementRawFunction::getConstraints() { return constraints; } +vector>> StatementRawFunction::getArguments() { + return arguments; +} + +shared_ptr StatementRawFunction::getReturnValueType() { + return returnValueType; +} + string StatementRawFunction::getRawSource() { return rawSource; } \ No newline at end of file diff --git a/src/Parser/Statement/StatementRawFunction.h b/src/Parser/Statement/StatementRawFunction.h index 989e5ea..372592f 100644 --- a/src/Parser/Statement/StatementRawFunction.h +++ b/src/Parser/Statement/StatementRawFunction.h @@ -1,16 +1,20 @@ #include "Parser/Statement/Statement.h" -class Expression; +class ValueType; class StatementRawFunction: public Statement { private: string name; string constraints; + vector>> arguments; + shared_ptr returnValueType; string rawSource; public: - StatementRawFunction(string name, string constraints, string rawSource); + StatementRawFunction(string name, string constraints, vector>> arguments, shared_ptr returnValueType, string rawSource); string getName(); string getConstraints(); + vector>> getArguments(); + shared_ptr getReturnValueType(); string getRawSource(); }; \ No newline at end of file