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