From 5616036c17507df465e30032369b522a79fc8579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Mon, 14 Jul 2025 21:40:18 +0900 Subject: [PATCH] Pass in constraints --- samples/test.brc | 4 ++-- src/Compiler/ModuleBuilder.cpp | 2 +- src/Parser/Parser.cpp | 16 +++++++++++++++- src/Parser/Statement/StatementRawFunction.cpp | 8 ++++++-- src/Parser/Statement/StatementRawFunction.h | 4 +++- 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/samples/test.brc b/samples/test.brc index ec9d515..ed136ac 100644 --- a/samples/test.brc +++ b/samples/test.brc @@ -20,11 +20,11 @@ i u32 <- 0, rep text[i] != 0: // text data <- "Hello world!" -/*addStuff asm<+r, r>: num1 u32, num2 u32 -> u32 +/*addStuff asm<"+r, r">: num1 u32, num2 u32 -> u32 add $1, $0 ;*/ -rawAdd raw +rawAdd raw<"~{ebx}"> //push rbx mov ebx, 5 //pop rbx diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index 979efa3..d9b5194 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -135,7 +135,7 @@ void ModuleBuilder::buildRawFunction(shared_ptr statement) vector types; llvm::FunctionType *funType = llvm::FunctionType::get(llvm::Type::getVoidTy(*context), types, false); - llvm::InlineAsm *rawFun = llvm::InlineAsm::get(funType, statement->getRawSource(), "~{ebx}", false, false, llvm::InlineAsm::AsmDialect::AD_Intel); + llvm::InlineAsm *rawFun = llvm::InlineAsm::get(funType, statement->getRawSource(), statement->getConstraints(), false, false, llvm::InlineAsm::AsmDialect::AD_Intel); if (!setRawFun(statement->getName(), rawFun)) return; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 6759a14..54c4e1f 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -240,12 +240,26 @@ shared_ptr Parser::matchStatementRawFunction() { return nullptr; string name; + string constraints; string rawSource; // name name = tokens.at(currentIndex++)->getLexme(); currentIndex++; // skip raw + // constraints + + if (tryMatchingTokenKinds({TokenKind::LESS}, true, true)) { + if (tokens.at(currentIndex)->isOfKind({TokenKind::STRING})) { + constraints = tokens.at(currentIndex++)->getLexme(); + // remove enclosing quotes + if (constraints.length() >= 2) + constraints = constraints.substr(1, constraints.length() - 2); + } + if (!tryMatchingTokenKinds({TokenKind::GREATER}, true, true)) + markError({TokenKind::GREATER}, {}); + } + // consume new line if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) { markError(TokenKind::NEW_LINE, {}); @@ -267,7 +281,7 @@ shared_ptr Parser::matchStatementRawFunction() { return nullptr; } - return make_shared(name, rawSource); + return make_shared(name, constraints, rawSource); } shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds) { diff --git a/src/Parser/Statement/StatementRawFunction.cpp b/src/Parser/Statement/StatementRawFunction.cpp index e40d9da..5369a42 100644 --- a/src/Parser/Statement/StatementRawFunction.cpp +++ b/src/Parser/Statement/StatementRawFunction.cpp @@ -1,12 +1,16 @@ #include "StatementRawFunction.h" -StatementRawFunction::StatementRawFunction(string name, string rawSource): -Statement(StatementKind::RAW_FUNCTION), name(name), rawSource(rawSource) { } +StatementRawFunction::StatementRawFunction(string name, string constraints, string rawSource): +Statement(StatementKind::RAW_FUNCTION), name(name), constraints(constraints), rawSource(rawSource) { } string StatementRawFunction::getName() { return name; } +string StatementRawFunction::getConstraints() { + return constraints; +} + 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 1a51566..989e5ea 100644 --- a/src/Parser/Statement/StatementRawFunction.h +++ b/src/Parser/Statement/StatementRawFunction.h @@ -5,10 +5,12 @@ class Expression; class StatementRawFunction: public Statement { private: string name; + string constraints; string rawSource; public: - StatementRawFunction(string name, string rawSource); + StatementRawFunction(string name, string constraints, string rawSource); string getName(); + string getConstraints(); string getRawSource(); }; \ No newline at end of file