Date: Mon, 8 Sep 2014 16:54:39 GMT From: dpl@FreeBSD.org To: svn-soc-all@FreeBSD.org Subject: socsvn commit: r273809 - soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw Message-ID: <201409081654.s88Gsd4j071601@socsvn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dpl Date: Mon Sep 8 16:54:38 2014 New Revision: 273809 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=273809 Log: Squashed some bugs. It works now. Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_pfil.c soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_pfil.c ============================================================================== --- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_pfil.c Mon Sep 8 15:42:47 2014 (r273808) +++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/ip_fw_pfil.c Mon Sep 8 16:54:38 2014 (r273809) @@ -147,6 +147,7 @@ ret = ipfw_chk_jit(args, chain); IPFW_PF_RUNLOCK(chain); } + #include <err.h> return (ret); } Modified: soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc ============================================================================== --- soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Mon Sep 8 15:42:47 2014 (r273808) +++ soc2014/dpl/netmap-ipfwjit/sys/netpfil/ipfw/jit.cc Mon Sep 8 16:54:38 2014 (r273809) @@ -44,10 +44,16 @@ using namespace llvm; +// if (logging) { +// Value *Str = Irb.CreateGlobalString("\nipfw_chk_jit(): firstf\n\n"); +// Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); +// Irb.CreateCall(PrintfFunc, StrFirstElement); +// } + class ipfwJIT { Module *mod; Function *Func; - LLVMContext *Con; + LLVMContext &Con; IRBuilder<> Irb; // We'll store the BasicBlock objects for each rule here. @@ -135,7 +141,6 @@ Function *Set_match; Function *Jump_fast; - // Not pkg-filtering related funcs. Function *PrintfFunc; Function *Ipfw_find_rule; @@ -175,7 +180,7 @@ return (NULL); } - auto modptr = parseBitcodeFile(buff.get().get(), *Con); + auto modptr = parseBitcodeFile(buff.get().get(), Con); if ((modptr.getError())){ std::cerr << "Failed to parse bitcode: " << buff.getError() << "\n"; return (NULL); @@ -186,7 +191,7 @@ BasicBlock* nextRule() { - int nextn = rulenumber+1; + int nextn = rulenumber + 1; if (nextn >= rules.size()) return (End); else @@ -209,10 +214,10 @@ Chain = &arglist.back(); // Get Type objects - Int8Ty = Type::getInt8Ty(*Con); - Int16Ty = Type::getInt16Ty(*Con); - Int32Ty = Type::getInt32Ty(*Con); - Int64Ty = Type::getInt64Ty(*Con); + Int8Ty = Type::getInt8Ty(Con); + Int16Ty = Type::getInt16Ty(Con); + Int32Ty = Type::getInt32Ty(Con); + Int64Ty = Type::getInt64Ty(Con); Int8PtrTy = PointerType::getUnqual(Int8Ty); // Get StrucType from bitcode. @@ -281,108 +286,98 @@ allocaAndInit() { Irb.SetInsertPoint(Entry); - // Control flow variables. - L = Irb.CreateAlloca(Int32Ty); - Done = Irb.CreateAlloca(Int32Ty); + // Control flow variables. + Done = Irb.CreateAlloca(Int32Ty, nullptr, "done"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Done); - FPos = Irb.CreateAlloca(Int32Ty); + FPos = Irb.CreateAlloca(Int32Ty, nullptr, "fpos"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), FPos); - Retval = Irb.CreateAlloca(Int32Ty); + Retval = Irb.CreateAlloca(Int32Ty, nullptr, "retval"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Retval); - Cmd = Irb.CreateAlloca(Ipfw_insnPtrTy); - Tablearg = Irb.CreateAlloca(Int32Ty); - CmdLen = Irb.CreateAlloca(Int32Ty); - SkipOr = Irb.CreateAlloca(Int32Ty); - F = Irb.CreateAlloca(Ip_fwPtrTy); - // m = args->m (idx: 0) - MPtr = Irb.CreateAlloca(MbufPtrTy); + MPtr = Irb.CreateAlloca(MbufPtrTy, nullptr, "m"); Irb.CreateStore(Irb.CreateLoad(Irb.CreateStructGEP(Args, 0)), MPtr); Value *M = Irb.CreateLoad(MPtr); // ip = (struct ip *)((m)->m_data) (idx: 2) - IpPtr = Irb.CreateAlloca(IpPtrTy); + IpPtr = Irb.CreateAlloca(IpPtrTy, nullptr, "ip"); Value *M_data = Irb.CreateStructGEP(M, 2); Value *M_casted = Irb.CreateBitCast(M_data, IpPtrTy); Irb.CreateStore(M_casted, IpPtr); - Ucred_cache = Irb.CreateAlloca(UcredTy); // Init: NULL if type ucred. - - Ucred_lookup = Irb.CreateAlloca(Int32Ty); + Ucred_lookup = Irb.CreateAlloca(Int32Ty, nullptr, "ucred_lookup"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Ucred_lookup); - Oif = Irb.CreateAlloca(IfnetTy); // Init: args->oif + Oif = Irb.CreateAlloca(IfnetTy, nullptr, "oif"); // Init: args->oif Irb.CreateLoad(Irb.CreateStructGEP(Args, 1), Oif); - Hlen = Irb.CreateAlloca(Int32Ty); + Hlen = Irb.CreateAlloca(Int32Ty, nullptr, "hlen"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Hlen); - Offset = Irb.CreateAlloca(Int16Ty); + Offset = Irb.CreateAlloca(Int16Ty, nullptr, "offset"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Offset); - Ip6f_mf = Irb.CreateAlloca(Int16Ty); + Ip6f_mf = Irb.CreateAlloca(Int16Ty, nullptr, "ip6f_mf"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Ip6f_mf); - // proto = args->f_id.proto = 0 - // proto = 0; - Proto = Irb.CreateAlloca(Int8Ty); + // proto = 0 + Proto = Irb.CreateAlloca(Int8Ty, nullptr, "proto"); Irb.CreateStore(ConstantInt::get(Int8Ty, 0), Proto); // args->f_id.proto = 0 (idx: 6, 5) Value *F_id = Irb.CreateStructGEP(Args, 6); - Value *Proto = Irb.CreateStructGEP(F_id, 5); - Irb.CreateStore(ConstantInt::get(Int8Ty, 0), Proto); + Value *FProto = Irb.CreateStructGEP(F_id, 5); + Irb.CreateStore(ConstantInt::get(Int8Ty, 0), FProto); - Src_port = Irb.CreateAlloca(Int16Ty); + Src_port = Irb.CreateAlloca(Int16Ty, nullptr, "src_port"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Src_port); - Dst_port = Irb.CreateAlloca(Int16Ty); + Dst_port = Irb.CreateAlloca(Int16Ty, nullptr, "dst_port"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Dst_port); //src_ip.s_addr = 0; - Src_ip = Irb.CreateAlloca(In_addrTy); + Src_ip = Irb.CreateAlloca(In_addrTy, nullptr, "src_ip"); Value *Src_s_addr = Irb.CreateStructGEP(Src_ip, 0); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Src_s_addr); //dst_ip.s_addr = 0; - Dst_ip = Irb.CreateAlloca(In_addrTy); + Dst_ip = Irb.CreateAlloca(In_addrTy, nullptr, "dst_ip"); Value *Dst_s_addr = Irb.CreateStructGEP(Dst_ip, 0); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Dst_s_addr); //iplen = 0; - Iplen = Irb.CreateAlloca(Int16Ty); + Iplen = Irb.CreateAlloca(Int16Ty, nullptr, "iplen"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Iplen); // pktlen = m->m_pkthdr.len; // m_pkthdr is the 6th element (idx: 5) // len is the 2nd element (idx: 1) - Pktlen = Irb.CreateAlloca(Int32Ty); + Pktlen = Irb.CreateAlloca(Int32Ty, nullptr, "pktlen"); Value *Header = Irb.CreateStructGEP(M, 5); Value *LengthPtr = Irb.CreateStructGEP(Header, 1); Value *Length = Irb.CreateLoad(LengthPtr); Irb.CreateStore(Length, Pktlen); - Etype = Irb.CreateAlloca(Int16Ty); + Etype = Irb.CreateAlloca(Int16Ty, nullptr, "etype"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Etype); - Dyn_dir = Irb.CreateAlloca(Int32Ty); + Dyn_dir = Irb.CreateAlloca(Int32Ty, nullptr, "dyn_dir"); Irb.CreateStore(ConstantInt::get(Int32Ty, MATCH_UNKNOWN), Dyn_dir); - Q = Irb.CreateAlloca(Ipfw_dyn_rulePtrTy); + Q = Irb.CreateAlloca(Ipfw_dyn_rulePtrTy, nullptr, "q"); Irb.CreateStore(ConstantPointerNull::get(Ipfw_dyn_rulePtrTy), Q); // There are no (void *), we use i8* - Ulp = Irb.CreateAlloca(Int8PtrTy); + Ulp = Irb.CreateAlloca(Int8PtrTy, nullptr, "ulp"); Irb.CreateStore(ConstantPointerNull::get(Int8PtrTy), Ulp); - Is_ipv4 = Irb.CreateAlloca(Int32Ty); + Is_ipv4 = Irb.CreateAlloca(Int32Ty, nullptr, "is_ipv4"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Is_ipv4); - Is_ipv6 = Irb.CreateAlloca(Int32Ty); + Is_ipv6 = Irb.CreateAlloca(Int32Ty, nullptr, "is_ipv6"); Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Is_ipv6); - Icmp6_type = Irb.CreateAlloca(Int8Ty); + Icmp6_type = Irb.CreateAlloca(Int8Ty, nullptr, "icmp6_type"); Irb.CreateStore(ConstantInt::get(Int8Ty, 0), Icmp6_type); - Ext_hd = Irb.CreateAlloca(Int16Ty); + Ext_hd = Irb.CreateAlloca(Int16Ty, nullptr, "ext_hd"); Irb.CreateStore(ConstantInt::get(Int16Ty, 0), Ext_hd); // If it returns one, goto pullup_failed. @@ -402,12 +397,11 @@ void emit_pullup_failed() { - BasicBlock *print = BasicBlock::Create(*Con, "print", Func); - BasicBlock *ret = BasicBlock::Create(*Con, "ret", Func); + BasicBlock *print = BasicBlock::Create(Con, "print", Func); + BasicBlock *ret = BasicBlock::Create(Con, "ret", Func); Value *Is_verbose, *Str, *Comp; - // VNET_DECLARE(int, fw_verbose); // #define V_fw_verbose VNET(fw_verbose) // We should be fine getting that from the Module. @@ -441,10 +435,10 @@ void emit_check_tag() { - BasicBlock *Tagged = BasicBlock::Create(*Con, "tagged", Func); - BasicBlock *Nottagged = BasicBlock::Create(*Con, "nottagged", Func); - BasicBlock *Jt = BasicBlock::Create(*Con, "jt", Func); - BasicBlock *Jf = BasicBlock::Create(*Con, "jf", Func); + BasicBlock *Tagged = BasicBlock::Create(Con, "tagged", Func); + BasicBlock *Nottagged = BasicBlock::Create(Con, "nottagged", Func); + BasicBlock *Jt = BasicBlock::Create(Con, "jt", Func); + BasicBlock *Jf = BasicBlock::Create(Con, "jf", Func); Value *Comp; @@ -471,6 +465,11 @@ Value *Slot = Irb.CreateStructGEP(Rule, 0); Value *SlotValue = Irb.CreateLoad(Slot); Comp = Irb.CreateICmpEQ(SlotValue, ConstantInt::get(Int32Ty, 0)); + // if (1) { + // Value *Str = Irb.CreateGlobalString("args->rule.slot: %d\n"); + // Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); + // Irb.CreateCall(PrintfFunc, {StrFirstElement}); + // } Irb.CreateCondBr(Comp, Nottagged, Tagged); Irb.SetInsertPoint(Tagged); @@ -491,10 +490,8 @@ Irb.SetInsertPoint(Jf); Value *Rulenum = Irb.CreateStructGEP(Rule, 1); Value *RulenumL = Irb.CreateLoad(Rulenum); - Value *RuleId = Irb.CreateStructGEP(Rule, 2); Value *RuleIdL = Irb.CreateLoad(RuleId); - Value *FindRuleCall = Irb.CreateCall3(Ipfw_find_rule, Chain, RulenumL, RuleIdL); Irb.CreateStore(FindRuleCall, FPos); @@ -505,12 +502,18 @@ // else f_pos = 0; // Since f_pos is initialized by default as 0, we only br. Irb.SetInsertPoint(Nottagged); + // XXX Fpos + // if (1) { + // Value *Str = Irb.CreateGlobalString("f_pos: %d\n&fpos: %p\n"); + // Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); + // Irb.CreateCall(PrintfFunc, {StrFirstElement, FPos, FPos}); + // } // Jump to first rule. Irb.CreateBr(rules.front()); } public: - ipfwJIT(int rulesnumber) : Con(&getGlobalContext()), Irb(*Con) + ipfwJIT(int rulesnumber) : Con(getGlobalContext()), Irb(Con) { // Create the module and load the code. mod = loadBitcode("rules.bc"); @@ -521,11 +524,10 @@ // The entry basic block contains all the initialization // and allocation of resources, and a basic check done // before start emmiting the rules code. - Entry = BasicBlock::Create(*Con, "Entry", Func); - End = BasicBlock::Create(*Con, "End", Func); - CheckTag = BasicBlock::Create(*Con, "CheckTag", Func); - PullupFailed = BasicBlock::Create(*Con, "PullupFailed", Func); - + Entry = BasicBlock::Create(Con, "Entry", Func); + End = BasicBlock::Create(Con, "End", Func); + CheckTag = BasicBlock::Create(Con, "CheckTag", Func); + PullupFailed = BasicBlock::Create(Con, "PullupFailed", Func); // Get struct types, and store vars setEnv(); @@ -536,7 +538,7 @@ // Initialize the vector. rules = std::vector<BasicBlock *>(rulesnumber); for (auto &i: rules){ - i = BasicBlock::Create(*Con, "rule", Func); + i = BasicBlock::Create(Con, "rule", Func); } emit_check_tag(); @@ -552,7 +554,7 @@ // Optimise PassManagerBuilder PMBuilder; PMBuilder.OptLevel = 3; - PMBuilder.Inliner = createFunctionInliningPass(275); + //PMBuilder.Inliner = createFunctionInliningPass(275); // Function passes FunctionPassManager *PerFunctionPasses = new FunctionPassManager(mod); @@ -561,12 +563,6 @@ PerFunctionPasses->doFinalization(); delete PerFunctionPasses; - // Module passes - PassManager *PerModulePasses = new PassManager(); - PMBuilder.populateModulePassManager(*PerModulePasses); - PerModulePasses->run(*mod); - delete PerModulePasses; - // We don't need it anymore. Function *vf = mod->getFunction("voidfunction"); vf->eraseFromParent(); @@ -575,7 +571,7 @@ std::string errstr; EngineBuilder EB = EngineBuilder(std::unique_ptr<Module>(mod)); - EB.setEngineKind(EngineKind::Kind::JIT); + //EB.setEngineKind(EngineKind::Kind::JIT); EB.setErrorStr(&errstr); EB.setOptLevel(CodeGenOpt::Level::Aggressive); EB.setUseMCJIT(true); @@ -587,10 +583,9 @@ exit(1); } - // printf("FuncPtr: %p\n", (void *)EE->getPointerToFunction(Func)); - // printf("FuncPtr: %p\n", (void *)EE->getPointerToNamedFunction("ipfw_chk_jit")); - // printf("FuncPtr: %p\n", (void *)EE->getFunctionAddress("ipfw_chk_jit")); - // return (funcptr)EE->getFunctionAddress("ipfw_chk_jit"); + // mod->dump(); + + // XXX We should use a NON deperecated function. return (funcptr)EE->getPointerToFunction(mod->getFunction("ipfw_chk_jit")); } @@ -603,12 +598,11 @@ void emit_outer_for_prologue() { - BasicBlock *jt = BasicBlock::Create(*Con, "jt", Func); - BasicBlock *jf = BasicBlock::Create(*Con, "jf", Func); + BasicBlock *jt = BasicBlock::Create(Con, "jt", Func); + BasicBlock *jf = BasicBlock::Create(Con, "jf", Func); Value *SetDisable = mod->getGlobalVariable("set_disable"); - // All this variables are already allocated. // ipfw_insn *cmd; // uInt32_t tablearg = 0; // int l, cmdlen, skip_or; /* skip rest of OR block */ @@ -618,16 +612,28 @@ // continue; // skip_or = 0; - // Write at the rule. + // Write at the current rule. Irb.SetInsertPoint(rules[rulenumber]); + // ipfw_insn *cmd; + // uInt32_t tablearg = 0; + // int l, cmdlen, skip_or; /* skip rest of OR block */ + Cmd = Irb.CreateAlloca(Ipfw_insnPtrTy, nullptr, "cmd"); + Tablearg = Irb.CreateAlloca(Int32Ty, nullptr, "tablearg"); + L = Irb.CreateAlloca(Int32Ty, nullptr, "l"); + CmdLen = Irb.CreateAlloca(Int32Ty, nullptr, "cmdlen"); + SkipOr = Irb.CreateAlloca(Int32Ty, nullptr, "skipor"); + F = Irb.CreateAlloca(Ip_fwPtrTy, nullptr, "f"); + // uInt32_t tablearg = 0; Irb.CreateStore(ConstantInt::get(Int32Ty, 0), Tablearg); // f = chain->map[f_pos]; idxs: 5, f_pos - Value *MapPtr = Irb.CreateStructGEP(Chain, 5); - Value *Map = Irb.CreateLoad(MapPtr); - Value *MapFPos = Irb.CreateInBoundsGEP(Map, FPos); + Value *FPosL = Irb.CreateLoad(FPos); + Value *ExtFPos = Irb.CreateSExt(FPosL, Int64Ty); + Value *Map = Irb.CreateStructGEP(Chain, 5); + Value *MapL = Irb.CreateLoad(Map); + Value *MapFPos = Irb.CreateInBoundsGEP(MapL, ExtFPos); Value *MapFPosL = Irb.CreateLoad(MapFPos); Irb.CreateStore(MapFPosL, F); @@ -654,14 +660,14 @@ void emit_inner_for_prologue() { - BasicBlock *firstt = BasicBlock::Create(*Con, "firstt", Func); - BasicBlock *firstf = BasicBlock::Create(*Con, "firstf", Func); - BasicBlock *secondt = BasicBlock::Create(*Con, "secondt", Func); - BasicBlock *secondf = BasicBlock::Create(*Con, "secondf", Func); + BasicBlock *firstt = BasicBlock::Create(Con, "firstt", Func); + BasicBlock *firstf = BasicBlock::Create(Con, "firstf", Func); + BasicBlock *secondt = BasicBlock::Create(Con, "secondt", Func); + BasicBlock *secondf = BasicBlock::Create(Con, "secondf", Func); Value *Comp, *AndOp; - // The first to are the intializers of the for loop. + // The first two are initializers of the outer for. // l = f->cmd_len; // cmd = f->cmd; // @@ -683,15 +689,15 @@ // cmd = f->cmd; Value *FCmd = Irb.CreateStructGEP(FL, 11); - Value *FCmdL = Irb.CreateLoad(FCmd); - FCmd = Irb.CreateExtractValue(FCmdL, 0); - Value *CmdL = Irb.CreateLoad(Cmd); - Irb.CreateStore(FCmd, CmdL); + Value *Addr = Irb.CreateBitCast(FCmd, Ipfw_insnPtrTy); + Irb.CreateStore(Addr, Cmd); + // int match; - Match = Irb.CreateAlloca(Int32Ty); + Match = Irb.CreateAlloca(Int32Ty, nullptr, "match"); // int cmdlen; // cmdlen = ((cmd)->len & F_LEN_MASK); + Value *CmdL = Irb.CreateLoad(Cmd); Value *LenPtr = Irb.CreateStructGEP(CmdL, 1); Value *Len = Irb.CreateLoad(LenPtr); AndOp = Irb.CreateAnd(Len, ConstantInt::get(Int8Ty, F_LEN_MASK)); @@ -728,14 +734,14 @@ void emit_inner_for_epilogue() { - BasicBlock *matchnz = BasicBlock::Create(*Con, "matchnz", Func); - BasicBlock *matchz = BasicBlock::Create(*Con, "matchz", Func); - BasicBlock *jt = BasicBlock::Create(*Con, "jt", Func); - BasicBlock *sec_cond = BasicBlock::Create(*Con, "sec_cond", Func); - BasicBlock *matchzero = BasicBlock::Create(*Con, "matchzero", Func); - BasicBlock *matchnotzero = BasicBlock::Create(*Con, "matchnotzero", Func); - BasicBlock *is_or = BasicBlock::Create(*Con, "is_or", Func); - BasicBlock *Continue = BasicBlock::Create(*Con, "Continue", Func); + BasicBlock *matchnz = BasicBlock::Create(Con, "matchnz", Func); + BasicBlock *matchz = BasicBlock::Create(Con, "matchz", Func); + BasicBlock *jt = BasicBlock::Create(Con, "jt", Func); + BasicBlock *sec_cond = BasicBlock::Create(Con, "sec_cond", Func); + BasicBlock *matchzero = BasicBlock::Create(Con, "matchzero", Func); + BasicBlock *matchnotzero = BasicBlock::Create(Con, "matchnotzero", Func); + BasicBlock *is_or = BasicBlock::Create(Con, "is_or", Func); + BasicBlock *Continue = BasicBlock::Create(Con, "Continue", Func); Value *Comp, *AndOp; @@ -838,13 +844,9 @@ { Value *Rule, *TimeUptime, *Str; - BasicBlock *Jt = BasicBlock::Create(*Con, "jt", Func); - BasicBlock *Jf = BasicBlock::Create(*Con, "jf", Func); - BasicBlock *DoCache = BasicBlock::Create(*Con, "cache", Func); - BasicBlock *Ret = BasicBlock::Create(*Con, "ret", Func); - #ifdef __FreeBSD__ - BasicBlock *CacheNN = BasicBlock::Create(*Con, "cachennull", Func); - #endif + BasicBlock *Jt = BasicBlock::Create(Con, "jt", Func); + BasicBlock *Jf = BasicBlock::Create(Con, "jf", Func); + BasicBlock *Ret = BasicBlock::Create(Con, "ret", Func); Value *Comp, *AddOp; // if (done) { @@ -858,14 +860,10 @@ // printf("ipfw: ouch!, skip past end of rules, denying packet\n"); // } // - // #ifdef __FreeBSD__ - // if (ucred_cache != NULL) - // crfree(ucred_cache); - // #endif - // // return (retval); Irb.SetInsertPoint(End); + // We need to get the timestamp variable. TimeUptime = mod->getGlobalVariable("time_uptime"); Str = Irb.CreateGlobalString("ipfw: ouch!, skip past end of rules, denying packet\n"); @@ -877,10 +875,12 @@ Irb.SetInsertPoint(Jt); // struct ip_fw *rule = chain->map[f_pos]; - Rule = Irb.CreateAlloca(Ip_fwPtrTy); - Value *MapPtr = Irb.CreateStructGEP(Chain, 5); - Value *Map = Irb.CreateLoad(MapPtr); - Value *MapFPos = Irb.CreateInBoundsGEP(Map, FPos); + Rule = Irb.CreateAlloca(Ip_fwPtrTy, nullptr, "rule"); + Value *FPosL = Irb.CreateLoad(FPos); + Value *ExtFPos = Irb.CreateSExt(FPosL, Int64Ty); + Value *Map = Irb.CreateStructGEP(Chain, 5); + Value *MapL = Irb.CreateLoad(Map); + Value *MapFPos = Irb.CreateInBoundsGEP(MapL, ExtFPos); Value *MapFPosL = Irb.CreateLoad(MapFPos); Irb.CreateStore(MapFPosL, Rule); @@ -910,7 +910,7 @@ Value *TimeUptimeL32 = Irb.CreateTrunc(TimeUptimeL, Int32Ty); Value *Timestamp = Irb.CreateStructGEP(RuleL, 10); Irb.CreateStore(TimeUptimeL32, Timestamp); - Irb.CreateBr(DoCache); + Irb.CreateBr(Ret); Irb.SetInsertPoint(Jf); // retval = IP_FW_DENY; @@ -918,22 +918,7 @@ Irb.CreateStore(ConstantInt::get(Int32Ty, IP_FW_DENY), Retval); Value *StrFirstElement = Irb.CreateStructGEP(Str, 0); Irb.CreateCall(PrintfFunc, StrFirstElement); - Irb.CreateBr(DoCache); - - Irb.SetInsertPoint(DoCache); -#ifndef __FreeBSD__ Irb.CreateBr(Ret); -#endif - -#ifdef __FreeBSD__ - // if (ucred_cache != NULL) - Comp = Irb.CreateICmpNE(Ucred_cache, - ConstantPointerNull::get(UcredPtrTy)); - Irb.CreateCondBr(Comp, CacheNN, Ret); - - Irb.SetInsertPoint(CacheNN); - Irb.CreateBr(Ret); -#endif //Return retval Irb.SetInsertPoint(Ret); @@ -943,32 +928,30 @@ // Rules + // XXX Not tested. void emit_nop() { - //break; - Irb.CreateBr(nextRule()); Irb.CreateStore(ConstantInt::get(Int32Ty, 1), Match); } + // XXX Not tested. void emit_forward_mac(u_int8_t opcode) { printf("Compilation error:\n"); printf("ipfwjitter: opcode %d unimplemented\n", opcode); printf("Compilation continues.\n"); - //break; - Irb.CreateBr(nextRule()); } - // check_uidgid() returns 0 on userspace. + // XXX Not tested. void emit_jail() { - BasicBlock *OffsetNZ = BasicBlock::Create(*Con, "offsetnotzero", Func); - BasicBlock *OffsetZE = BasicBlock::Create(*Con, "offsetiszero", Func); - BasicBlock *TCPorUDP = BasicBlock::Create(*Con, "setmatchzero", Func); - BasicBlock *Continue = BasicBlock::Create(*Con, "Continue", Func); + BasicBlock *OffsetNZ = BasicBlock::Create(Con, "offsetnotzero", Func); + BasicBlock *OffsetZE = BasicBlock::Create(Con, "offsetiszero", Func); + BasicBlock *TCPorUDP = BasicBlock::Create(Con, "setmatchzero", Func); + BasicBlock *Continue = BasicBlock::Create(Con, "Continue", Func); Value *Comp; // if (offset != 0) @@ -1003,10 +986,9 @@ // Keep on with the for epilogue. Irb.SetInsertPoint(Continue); - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_recv() { @@ -1015,10 +997,9 @@ Value *cmdc = Irb.CreateBitCast(Cmd, Ipfw_insn_ifPtrTy); Value *IfaceMatchCall = Irb.CreateCall4(Iface_match, rcvif, cmdc, Chain, Tablearg); Irb.CreateStore(IfaceMatchCall, Match); - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_xmit() { @@ -1026,416 +1007,323 @@ Value *Cmdc = Irb.CreateBitCast(Cmd, Ipfw_insn_ifPtrTy); Value *IfaceMatchCall = Irb.CreateCall4(Iface_match, Oif, Cmdc, Chain, Tablearg); Irb.CreateStore(IfaceMatchCall, Match); - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_via() { + BasicBlock *OifNZ = BasicBlock::Create(Con, "OifNotZero", Func); + BasicBlock *OifZE = BasicBlock::Create(Con, "OifIsZero", Func); + + // if (oif) + // match = iface_match(oif, (ipfw_insn_if *)cmd, chain, &tablearg); + // else + // match = iface_match(m->m_pkthdr.rcvif, (ipfw_insn_if *)cmd, + // chain, &tablearg); + // break; + //Value *Comp = Irb.CreateICmp(Oif, ConstantPointerNull::get(IfnetPtrTy)); - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_macaddr2() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_mac_type() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_frag() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_in() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_layer2() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_diverted() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_proto() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_src() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_dst_lookup() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_dst_mask() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_src_me() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip6_src_me() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_src_set() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_dst() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_dst_me() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip6_dst_me() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip_dstport() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_icmptype() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_icmp6type() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ipopt() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ipver() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ipttl() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ipprecedence() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_iptos() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_dscp() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpdatalen() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpflags() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpopts() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpseq() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpack() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_tcpwin() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_estab() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_altq() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_log() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_prob() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_verrevpath() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_versrcreach() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_antispoof() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ipsec() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip6_src() { - - //break; - Irb.CreateBr(nextRule()); } + // XXX Not tested. void emit_ip6_dst() *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409081654.s88Gsd4j071601>