Commit b6635516 authored by Alastair Robertson's avatar Alastair Robertson

Some C code generation, without maps done correctly

parent 070a329e
...@@ -8,50 +8,124 @@ namespace ast { ...@@ -8,50 +8,124 @@ namespace ast {
void CodegenBCC::visit(Integer &integer) void CodegenBCC::visit(Integer &integer)
{ {
code << integer.n;
} }
void CodegenBCC::visit(Builtin &builtin) void CodegenBCC::visit(Builtin &builtin)
{ {
code << builtin.ident;
} }
void CodegenBCC::visit(Call &call) void CodegenBCC::visit(Call &call)
{ {
code << call.func << "(";
if (call.vargs) {
for (Expression *expr : *call.vargs) {
expr->accept(*this);
code << ", ";
}
}
code << ")";
} }
void CodegenBCC::visit(Map &map) void CodegenBCC::visit(Map &map)
{ {
code << map.ident;
if (map.vargs) {
code << "[";
for (Expression *expr : *map.vargs) {
expr->accept(*this);
code << ", ";
}
code << "]";
}
} }
void CodegenBCC::visit(Binop &binop) void CodegenBCC::visit(Binop &binop)
{ {
code << "(";
binop.left->accept(*this);
switch (binop.op) {
case ebpf::bpftrace::Parser::token::EQ: code << "=="; break;
case ebpf::bpftrace::Parser::token::NE: code << "!="; break;
case ebpf::bpftrace::Parser::token::LE: code << "<="; break;
case ebpf::bpftrace::Parser::token::GE: code << ">="; break;
case ebpf::bpftrace::Parser::token::LT: code << "<"; break;
case ebpf::bpftrace::Parser::token::GT: code << ">"; break;
case ebpf::bpftrace::Parser::token::LAND: code << "&&"; break;
case ebpf::bpftrace::Parser::token::LOR: code << "||"; break;
case ebpf::bpftrace::Parser::token::PLUS: code << "+"; break;
case ebpf::bpftrace::Parser::token::MINUS: code << "-"; break;
case ebpf::bpftrace::Parser::token::MUL: code << "*"; break;
case ebpf::bpftrace::Parser::token::DIV: code << "/"; break;
case ebpf::bpftrace::Parser::token::MOD: code << "%"; break;
case ebpf::bpftrace::Parser::token::BAND: code << "&"; break;
case ebpf::bpftrace::Parser::token::BOR: code << "|"; break;
case ebpf::bpftrace::Parser::token::BXOR: code << "^"; break;
default: break;
}
binop.right->accept(*this);
code << ")";
} }
void CodegenBCC::visit(Unop &unop) void CodegenBCC::visit(Unop &unop)
{ {
code << "(";
switch (unop.op) {
case ebpf::bpftrace::Parser::token::LNOT: code << "!"; break;
case ebpf::bpftrace::Parser::token::BNOT: code << "~"; break;
default: break;
}
unop.expr->accept(*this);
code << ")";
} }
void CodegenBCC::visit(ExprStatement &expr) void CodegenBCC::visit(ExprStatement &expr)
{ {
expr.expr->accept(*this);
} }
void CodegenBCC::visit(AssignMapStatement &assignment) void CodegenBCC::visit(AssignMapStatement &assignment)
{ {
assignment.map->accept(*this);
code << "=";
assignment.expr->accept(*this);
} }
void CodegenBCC::visit(AssignMapCallStatement &assignment) void CodegenBCC::visit(AssignMapCallStatement &assignment)
{ {
assignment.map->accept(*this);
code << "=";
assignment.call->accept(*this);
} }
void CodegenBCC::visit(Predicate &pred) void CodegenBCC::visit(Predicate &pred)
{ {
code << "if (!(";
pred.expr->accept(*this);
code << ")) return 0;" << std::endl;
} }
void CodegenBCC::visit(Probe &probe) void CodegenBCC::visit(Probe &probe)
{ {
code << "int " << probe.type << "__" << probe.attach_point << "() {" << std::endl;
if (probe.pred) {
probe.pred->accept(*this);
}
for (Statement *stmt : *probe.stmts) {
stmt->accept(*this);
code << ";" << std::endl;
}
code << "return 0;\n}" << std::endl;
} }
void CodegenBCC::visit(Program &program) void CodegenBCC::visit(Program &program)
{ {
for (Probe *probe : *program.probes) {
probe->accept(*this);
}
} }
} // namespace ast } // namespace ast
......
#pragma once #pragma once
#include <memory> #include <memory>
#include <sstream>
#include "ast.h" #include "ast.h"
#include "map.h" #include "map.h"
...@@ -24,6 +25,7 @@ public: ...@@ -24,6 +25,7 @@ public:
void visit(Probe &probe) override; void visit(Probe &probe) override;
void visit(Program &program) override; void visit(Program &program) override;
std::ostringstream code;
private: private:
std::map<std::string, std::unique_ptr<ebpf::bpftrace::Map>> maps_; std::map<std::string, std::unique_ptr<ebpf::bpftrace::Map>> maps_;
}; };
......
#include <istream> #include <iostream>
#include <ostream>
#include "driver.h" #include "driver.h"
#include "printer.h" #include "printer.h"
...@@ -70,6 +69,7 @@ int Driver::compile_bcc() ...@@ -70,6 +69,7 @@ int Driver::compile_bcc()
{ {
ast::CodegenBCC c; ast::CodegenBCC c;
root_->accept(c); root_->accept(c);
std::cout << c.code.str();
} }
} // namespace bpftrace } // namespace bpftrace
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment