socsvn commit: r271237 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw
dpl at FreeBSD.org
dpl at FreeBSD.org
Tue Jul 22 13:26:55 UTC 2014
Author: dpl
Date: Tue Jul 22 13:26:54 2014
New Revision: 271237
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271237
Log:
Added basic boilerplate (to be modified).
Modified:
soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc
==============================================================================
--- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Jul 22 08:52:49 2014 (r271236)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Tue Jul 22 13:26:54 2014 (r271237)
@@ -1,5 +1,7 @@
/* JIT compilation code */
#include <iostream>
+#include <string>
+#include <vector>
#include <llvm/ADT/OwningPtr.h>
#include <llvm/Bitcode/ReaderWriter.h>
@@ -10,6 +12,13 @@
using namespace llvm;
+struct funcdef {
+ string name;
+ int args;
+}
+
+vector<struct funcdef> funcdefs = {
+
Module *mod;
LLVMContext con;
LLVMContext &c = con;
@@ -33,4 +42,46 @@
}
mod = ptr.get();
ptr = parseBitcodeFile(buffer.get(), c);
+
+
+ // XXX - We have to automate this.
+ // Get the stub (prototype) for the cell function
+ F = Mod->getFunction("cell");
+ // Set it to have private linkage, so that it can be removed after being
+ // inlined.
+ F->setLinkage(GlobalValue::PrivateLinkage);
+ // Add an entry basic block to this function and set it
+ BasicBlock *entry = BasicBlock::Create(C, "entry", F);
+ B.SetInsertPoint(entry);
+ // Cache the type of registers
+ regTy = Type::getInt16Ty(C);
+
+ // Collect the function parameters
+ auto args = F->arg_begin();
+ oldGrid = args++;
+ newGrid = args++;
+ width = args++;
+ height = args++;
+ x = args++;
+ y = args++;
+
+ // Create space on the stack for the local registers
+ for (int i=0 ; i<10 ; i++)
+ {
+ a[i] = B.CreateAlloca(regTy);
+ }
+ // Create a space on the stack for the current value. This can be
+ // assigned to, and will be returned at the end. Store the value passed
+ // as a parameter in this.
+ v = B.CreateAlloca(regTy);
+ B.CreateStore(args++, v);
+
+ // Create a load of pointers to the global registers.
+ Value *gArg = args;
+ for (int i=0 ; i<10 ; i++)
+ {
+ B.CreateStore(ConstantInt::get(regTy, 0), a[i]);
+ g[i] = B.CreateConstGEP1_32(gArg, i);
+ }
+
}
More information about the svn-soc-all
mailing list