Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Aug 2014 19:30:59 GMT
From:      dpl@FreeBSD.org
To:        svn-soc-all@FreeBSD.org
Subject:   socsvn commit: r271868 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw
Message-ID:  <201408041930.s74JUx4D040695@socsvn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dpl
Date: Mon Aug  4 19:30:59 2014
New Revision: 271868
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=271868

Log:
  Added the basic starting code.
  

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	Mon Aug  4 19:30:13 2014	(r271867)
+++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc	Mon Aug  4 19:30:59 2014	(r271868)
@@ -32,106 +32,135 @@
 
 using namespace llvm;
 
-class jitCompiler {
+class ipfwJIT {
 	private:
-		Module *mod;
-		LLVMContext con;
-		LLVMContext &c = con;
-		OwningPtr<MemoryBuffer> buffer;
-		//IRBuilder<> irb;
-	public:
-		Module *loadbc(std::string name)
-		{
-			/* We load the bc for JIT compilation */
-			error_code ec = MemoryBuffer::getFile(name, buffer);
-			if (ec) {
-				std::cerr << "Failed to open bitcode: " << ec.message() << "\n";
-				return (NULL);
-			}
-
-			ErrorOr<Module*> ptr = parseBitcodeFile(buffer.get(), con);
-			if ((ec = ptr.getError()))
-			{
-				std::cerr << "Failed to parse bitcode: " << ec.message() << "\n";
-				return (NULL);
-			}
-			return (ptr.get());
+	Module *mod;
+	Function *func;
+	LLVMContext con;
+	OwningPtr<MemoryBuffer> buffer;
+	IRBuilder<> irb;
+	std::vector<BasicBlock> BBs;
+
+	Module *loadbc(std::string name)
+	{
+		/* We load the bc for JIT compilation */
+		error_code ec = MemoryBuffer::getFile(name, buffer);
+		if (ec) {
+			std::cerr << "Failed to open bitcode: " << ec.message() << "\n";
+			return (NULL);
 		}
 
-		int
-		emit_nop(Type *match)
+		ErrorOr<Module*> ptr = parseBitcodeFile(buffer.get(), con);
+		if ((ec = ptr.getError()))
 		{
-			/*
-				static IPFW_RULES_INLINE void
-				rule_nop(int *match)
-				{
-					*match = 1;
-				}
-			// 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++;
+			std::cerr << "Failed to parse bitcode: " << ec.message() << "\n";
+			return (NULL);
+		}
+		mod = ptr.get();
+		return (mod);
+	}
 
-			// Create space on the stack for the local registers
-			for (int i=0 ; i<10 ; i++)
-			{
-				a[i] = B.CreateAlloca(regTy);
-			}
+	/* Set the needed variables to perform pkt filtering. */
+	int
+	setVars()
+	{
+		//We need the match var.
+		Value *match;
+		Value *f_pos;
+		return (0);
+	}
 
-			// 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++)
+	public: 
+	ipfwJIT(): irb(con)
+	{
+		//Create the module and load the code.
+		mod = loadbc("ip_fw_rules.bc");
+		setVars();
+		//Create Function, and start its first BasicBlock.
+		//int ipfw_chk_jitted(ip_fw_args *);
+		// XXX Do we have to define ip_fw_args using this?
+		StructType ipfwargsTy = StructType::get(/*TYPE1, TYPE2, TYPE3...*/);
+		Type *argsTy[] = { PointerType::getUnqual(ipfwargsTy) };
+		FunctionType *ipfwchkTy = FunctionType::get(Int32Ty, argsTy, false);
+		func = Function::Create(ipfwchkTy, GlobalValue::PrivateLinkage, "ipfw_chk", mod);
+
+		// XXX Create basic block, and add it to BBs
+
+	}
+	~ipfwJIT()
+	{
+		if (mod)
+			delete mod;
+	}
+
+	int
+	emit_nop(int *match)
+	{
+		/*
+			static IPFW_RULES_INLINE void
+			rule_nop(int *match)
 			{
-				B.CreateStore(ConstantInt::get(regTy, 0), a[i]);
-				g[i] = B.CreateConstGEP1_32(gArg, i);
+				*match = 1;
 			}
-			*/
-			return (0);
-		}
+		// 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++;
 
-		int
-		emit_forward_mac()
+		// Create space on the stack for the local registers
+		for (int i=0 ; i<10 ; i++)
 		{
-			return (0);
+			a[i] = B.CreateAlloca(regTy);
 		}
 
-		/* Set the needed variables to perform pkt filtering. */
-		int
-		setVars()
+		// 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++)
 		{
-			return (0);
+			B.CreateStore(ConstantInt::get(regTy, 0), a[i]);
+			g[i] = B.CreateConstGEP1_32(gArg, i);
 		}
+		*/
+		return (0);
+	}
+
+	int
+	emit_forward_mac()
+	{
+		return (0);
+	}
 };
 
 extern "C" funcptr
 compile_code(struct ip_fw_args *args, struct ip_fw_chain *chain)
 {
-	int f_pos, res;
-	Module *bc;
-	jitCompiler comp;
+	int res;
+	ipfwJIT comp;
+	Module *mod;
 
-	bc = comp.loadbc("ip_fw_rules.bc");
+	int f_pos = 0;
+	int retval = 0;
 
 	// Now I have to load the stubs of the loaded rules.
 	// Iterate through the rules.
@@ -192,7 +221,7 @@
 
 			switch (cmd->opcode) {
 			case O_NOP:
-				comp.emit_nop(*match);
+				comp.emit_nop(&match);
 				break;
 
 			case O_FORWARD_MAC:
@@ -608,3 +637,4 @@
 
 	return (0);
 }
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201408041930.s74JUx4D040695>