[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
Török Edvin
edwin at clamav.net
Sun Apr 4 01:09:43 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit a45e257772c8acb70c85413ece8a4d394c4a2535
Author: Török Edvin <edwin at clamav.net>
Date: Wed Nov 11 09:50:50 2009 +0200
Fix bugs when loading bytecode.
diff --git a/libclamav/bytecode.c b/libclamav/bytecode.c
index a866cc9..0aa5624 100644
--- a/libclamav/bytecode.c
+++ b/libclamav/bytecode.c
@@ -75,6 +75,7 @@ int cli_bytecode_context_clear(struct cli_bc_ctx *ctx)
static unsigned typesize(const struct cli_bc *bc, uint16_t type)
{
+ type &= 0x7fff;
if (!type)
return 0;
if (type <= 8)
@@ -90,6 +91,7 @@ static unsigned typesize(const struct cli_bc *bc, uint16_t type)
static unsigned typealign(const struct cli_bc *bc, uint16_t type)
{
+ type &= 0x7fff;
if (type <= 64) {
unsigned size = typesize(bc, type);
return size ? size : 1;
@@ -434,13 +436,13 @@ static int parseLSig(struct cli_bc *bc, unsigned char *buffer)
char *vnames, *vend = strchr(buffer, ';');
if (vend) {
bc->lsig = cli_strdup(buffer);
+ *vend++ = '\0';
+ prefix = buffer;
+ vnames = strchr(vend, '{');
} else {
/* Not a logical signature, but we still have a virusname */
bc->lsig = NULL;
}
- *vend++ = '\0';
- prefix = buffer;
- vnames = strchr(vend, '{');
return CL_SUCCESS;
}
@@ -823,6 +825,8 @@ static int parseFunctionHeader(struct cli_bc *bc, unsigned fn, unsigned char *bu
}
for (i=0;i<all_locals;i++) {
func->types[i] = readNumber(buffer, &offset, len, &ok);
+ if (readFixedNumber(buffer, &offset, len, &ok, 1))
+ func->types[i] |= 0x8000;
}
if (!ok) {
cli_errmsg("Invalid local types\n");
diff --git a/libclamav/c++/Makefile.am b/libclamav/c++/Makefile.am
index b0af110..b078950 100644
--- a/libclamav/c++/Makefile.am
+++ b/libclamav/c++/Makefile.am
@@ -582,7 +582,9 @@ libllvmscalar_la_SOURCES=\
llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp\
llvm/lib/Transforms/Scalar/CodeGenLICM.cpp\
llvm/lib/Transforms/Scalar/DCE.cpp\
- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp\
+ llvm/lib/Transforms/Scalar/ConstantProp.cpp\
+ llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
libllvmtransformutils_la_CPPFLAGS=$(LLVM_INCLUDES) $(LLVM_DEFS)
libllvmtransformutils_la_CXXFLAGS=$(LLVM_CXXFLAGS) -fno-exceptions
diff --git a/libclamav/c++/Makefile.in b/libclamav/c++/Makefile.in
index 5e04d20..6d1befa 100644
--- a/libclamav/c++/Makefile.in
+++ b/libclamav/c++/Makefile.in
@@ -355,7 +355,9 @@ libllvmmc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
libllvmscalar_la_LIBADD =
am_libllvmscalar_la_OBJECTS = libllvmscalar_la-CodeGenPrepare.lo \
libllvmscalar_la-CodeGenLICM.lo libllvmscalar_la-DCE.lo \
- libllvmscalar_la-LoopStrengthReduce.lo
+ libllvmscalar_la-LoopStrengthReduce.lo \
+ libllvmscalar_la-ConstantProp.lo \
+ libllvmscalar_la-SimplifyCFGPass.lo
libllvmscalar_la_OBJECTS = $(am_libllvmscalar_la_OBJECTS)
libllvmscalar_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \
@@ -1399,7 +1401,9 @@ libllvmscalar_la_SOURCES = \
llvm/lib/Transforms/Scalar/CodeGenPrepare.cpp\
llvm/lib/Transforms/Scalar/CodeGenLICM.cpp\
llvm/lib/Transforms/Scalar/DCE.cpp\
- llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+ llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp\
+ llvm/lib/Transforms/Scalar/ConstantProp.cpp\
+ llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
libllvmtransformutils_la_CPPFLAGS = $(LLVM_INCLUDES) $(LLVM_DEFS)
libllvmtransformutils_la_CXXFLAGS = $(LLVM_CXXFLAGS) -fno-exceptions
@@ -1937,8 +1941,10 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmmc_la-TargetAsmParser.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-CodeGenLICM.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-CodeGenPrepare.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-ConstantProp.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-DCE.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-LoopStrengthReduce.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmscalar_la-SimplifyCFGPass.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmsdag_la-AsmPrinter.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmsdag_la-CallingConvLower.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libllvmsdag_la-DAGCombiner.Plo at am__quote@
@@ -3731,6 +3737,22 @@ libllvmscalar_la-LoopStrengthReduce.lo: llvm/lib/Transforms/Scalar/LoopStrengthR
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmscalar_la_CPPFLAGS) $(CPPFLAGS) $(libllvmscalar_la_CXXFLAGS) $(CXXFLAGS) -c -o libllvmscalar_la-LoopStrengthReduce.lo `test -f 'llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp' || echo '$(srcdir)/'`llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+libllvmscalar_la-ConstantProp.lo: llvm/lib/Transforms/Scalar/ConstantProp.cpp
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmscalar_la_CPPFLAGS) $(CPPFLAGS) $(libllvmscalar_la_CXXFLAGS) $(CXXFLAGS) -MT libllvmscalar_la-ConstantProp.lo -MD -MP -MF $(DEPDIR)/libllvmscalar_la-ConstantProp.Tpo -c -o libllvmscalar_la-ConstantProp.lo `test -f 'llvm/lib/Transforms/Scalar/ConstantProp.cpp' || echo '$(srcdir)/'`llvm/lib/Transforms/Scalar/ConstantProp.cpp
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libllvmscalar_la-ConstantProp.Tpo $(DEPDIR)/libllvmscalar_la-ConstantProp.Plo
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='llvm/lib/Transforms/Scalar/ConstantProp.cpp' object='libllvmscalar_la-ConstantProp.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmscalar_la_CPPFLAGS) $(CPPFLAGS) $(libllvmscalar_la_CXXFLAGS) $(CXXFLAGS) -c -o libllvmscalar_la-ConstantProp.lo `test -f 'llvm/lib/Transforms/Scalar/ConstantProp.cpp' || echo '$(srcdir)/'`llvm/lib/Transforms/Scalar/ConstantProp.cpp
+
+libllvmscalar_la-SimplifyCFGPass.lo: llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+ at am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmscalar_la_CPPFLAGS) $(CPPFLAGS) $(libllvmscalar_la_CXXFLAGS) $(CXXFLAGS) -MT libllvmscalar_la-SimplifyCFGPass.lo -MD -MP -MF $(DEPDIR)/libllvmscalar_la-SimplifyCFGPass.Tpo -c -o libllvmscalar_la-SimplifyCFGPass.lo `test -f 'llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp' || echo '$(srcdir)/'`llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+ at am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libllvmscalar_la-SimplifyCFGPass.Tpo $(DEPDIR)/libllvmscalar_la-SimplifyCFGPass.Plo
+ at am__fastdepCXX_FALSE@ $(AM_V_CXX) @AM_BACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp' object='libllvmscalar_la-SimplifyCFGPass.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmscalar_la_CPPFLAGS) $(CPPFLAGS) $(libllvmscalar_la_CXXFLAGS) $(CXXFLAGS) -c -o libllvmscalar_la-SimplifyCFGPass.lo `test -f 'llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp' || echo '$(srcdir)/'`llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp
+
libllvmsdag_la-CallingConvLower.lo: llvm/lib/CodeGen/SelectionDAG/CallingConvLower.cpp
@am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libllvmsdag_la_CPPFLAGS) $(CPPFLAGS) $(libllvmsdag_la_CXXFLAGS) $(CXXFLAGS) -MT libllvmsdag_la-CallingConvLower.lo -MD -MP -MF $(DEPDIR)/libllvmsdag_la-CallingConvLower.Tpo -c -o libllvmsdag_la-CallingConvLower.lo `test -f 'llvm/lib/CodeGen/SelectionDAG/CallingConvLower.cpp' || echo '$(srcdir)/'`llvm/lib/CodeGen/SelectionDAG/CallingConvLower.cpp
@am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libllvmsdag_la-CallingConvLower.Tpo $(DEPDIR)/libllvmsdag_la-CallingConvLower.Plo
diff --git a/libclamav/c++/bytecode2llvm.cpp b/libclamav/c++/bytecode2llvm.cpp
index 5c8be9a..69f647d 100644
--- a/libclamav/c++/bytecode2llvm.cpp
+++ b/libclamav/c++/bytecode2llvm.cpp
@@ -99,7 +99,7 @@ static void NORETURN jit_exception_handler(void)
void llvm_error_handler(void *user_data, const std::string &reason)
{
// Output it to stderr, it might exceed the 1k/4k limit of cli_errmsg
- errs() << reason;
+ errs() << MODULE << reason;
jit_exception_handler();
}
@@ -179,6 +179,7 @@ public:
const Type *get(uint16_t ty)
{
+ ty &= 0x7fff;
if (ty < 69)
return getStatic(ty);
ty -= 69;
@@ -225,9 +226,12 @@ private:
return Values[operand];
if (operand < func->numValues) {
Value *V = Values[operand];
- if (V->getType() == Ty)
+ if (func->types[operand]&0x8000 && V->getType() == Ty) {
return V;
- return Builder.CreateLoad(V);
+ }
+ V = Builder.CreateLoad(V);
+ assert(V->getType() == Ty);
+ return V;
}
unsigned w = (Ty->getPrimitiveSizeInBits()+7)/8;
return convertOperand(func, map[w], operand);
@@ -243,8 +247,11 @@ private:
unsigned w, operand_t operand) {
if (operand < func->numArgs)
return Values[operand];
- if (operand < func->numValues)
+ if (operand < func->numValues) {
+ if (func->types[operand]&0x8000)
+ return Values[operand];
return Builder.CreateLoad(Values[operand]);
+ }
if (operand & 0x80000000) {
operand &= 0x7fffffff;
@@ -309,7 +316,7 @@ private:
const Type* mapType(uint16_t typeID)
{
- return TypeMap->get(typeID);
+ return TypeMap->get(typeID&0x7fffffff);
}
Constant *buildConstant(const Type *Ty, uint64_t *components, unsigned &c)
@@ -364,6 +371,31 @@ public:
}
}
+ template <typename InputIterator>
+ bool createGEP(unsigned dest, Value *Base, InputIterator Start, InputIterator End) {
+ assert(dest >= numArgs && dest < numLocals+numArgs && "Instruction destination out of range");
+ const Type *Ty = GetElementPtrInst::getIndexedType(Base->getType(), Start, End);
+ const Type *ETy = cast<PointerType>(cast<PointerType>(Values[dest]->getType())->getElementType())->getElementType();
+ if (!Ty || (Ty != ETy && (!isa<IntegerType>(Ty) || !isa<IntegerType>(ETy)))) {
+ errs() << MODULE << "Wrong indices for GEP opcode: "
+ << " expected type: " << *ETy;
+ if (Ty)
+ errs() << " actual type: " << *Ty;
+ errs() << " base: " << *Base << " indices: ";
+ for (InputIterator I=Start; I != End; I++) {
+ errs() << **I << ", ";
+ }
+ errs() << "\n";
+ return false;
+ }
+ Value *V = Builder.CreateGEP(Base, Start, End);
+ if (Ty != ETy) {
+ V = Builder.CreateBitCast(V, PointerType::getUnqual(ETy));
+ }
+ Store(dest, V);
+ return true;
+ }
+
bool generate() {
TypeMap = new LLVMTypeMapper(Context, bc->types + 4, bc->num_types - 5);
@@ -383,6 +415,55 @@ public:
FHandler->addFnAttr(Attribute::NoInline);
EE->addGlobalMapping(FHandler, (void*)jit_exception_handler);
+ std::vector<const Type*> args;
+ args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
+ args.push_back(Type::getInt8Ty(Context));
+ args.push_back(Type::getInt32Ty(Context));
+ args.push_back(Type::getInt32Ty(Context));
+ FunctionType* FuncTy_3 = FunctionType::get(Type::getVoidTy(Context),
+ args, false);
+ Function *FMemset = Function::Create(FuncTy_3, GlobalValue::ExternalLinkage,
+ "llvm.memset.i32", M);
+ FMemset->setDoesNotThrow();
+ FMemset->setDoesNotCapture(1, true);
+
+ args.clear();
+ args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
+ args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
+ args.push_back(Type::getInt32Ty(Context));
+ args.push_back(Type::getInt32Ty(Context));
+ FunctionType* FuncTy_4 = FunctionType::get(Type::getVoidTy(Context),
+ args, false);
+ Function *FMemmove = Function::Create(FuncTy_4, GlobalValue::ExternalLinkage,
+ "llvm.memmove.i32", M);
+ FMemmove->setDoesNotThrow();
+ FMemmove->setDoesNotCapture(1, true);
+
+ Function *FMemcpy = Function::Create(FuncTy_4, GlobalValue::ExternalLinkage,
+ "llvm.memcpy.i32", M);
+ FMemcpy->setDoesNotThrow();
+ FMemcpy->setDoesNotCapture(1, true);
+
+ FunctionType* DummyTy = FunctionType::get(Type::getVoidTy(Context), false);
+ Function *FRealMemset = Function::Create(DummyTy, GlobalValue::ExternalLinkage,
+ "memset", M);
+ EE->addGlobalMapping(FRealMemset, (void*)memset);
+ Function *FRealMemmove = Function::Create(DummyTy, GlobalValue::ExternalLinkage,
+ "memmove", M);
+ EE->addGlobalMapping(FRealMemmove, (void*)memmove);
+ Function *FRealMemcpy = Function::Create(DummyTy, GlobalValue::ExternalLinkage,
+ "memcpy", M);
+ EE->addGlobalMapping(FRealMemcpy, (void*)memcpy);
+
+ args.clear();
+ args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
+ args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
+ args.push_back(EE->getTargetData()->getIntPtrType(Context));
+ FunctionType* FuncTy_5 = FunctionType::get(Type::getInt32Ty(Context),
+ args, false);
+ Function* FRealMemcmp = Function::Create(FuncTy_5, GlobalValue::ExternalLinkage, "memcmp", M);
+ EE->addGlobalMapping(FRealMemcmp, (void*)memcmp);
+
// The hidden ctx param to all functions
const Type *HiddenCtx = PointerType::getUnqual(Type::getInt8Ty(Context));
@@ -399,8 +480,6 @@ public:
if (isa<PointerType>(Ty)) {
unsigned g = bc->globals[i][1];
if (GVoffsetMap.count(g)) {
- const Type *MTy = GVtypeMap[g];
- assert(Ty == MTy);
FakeGVs.set(i);
globals.push_back(0);
continue;
@@ -477,16 +556,21 @@ public:
offset);
Value *GEP = Builder.CreateInBoundsGEP(Ctx, Idx);
const Type *Ty = GVtypeMap[g];
- Value *Cast = Builder.CreateBitCast(GEP,
- PointerType::getUnqual(Ty));
+ Ty = PointerType::getUnqual(PointerType::getUnqual(Ty));
+ Value *Cast = Builder.CreateBitCast(GEP, Ty);
Value *SpecialGV = Builder.CreateLoad(Cast);
- Constant *C = ConstantInt::get(Type::getInt32Ty(Context), bc->globals[i][0]);
- globals[i] = Builder.CreateInBoundsGEP(SpecialGV, C);
+ Value *C[] = {
+ ConstantInt::get(Type::getInt32Ty(Context), 0),
+ ConstantInt::get(Type::getInt32Ty(Context), bc->globals[i][0])
+ };
+ globals[i] = Builder.CreateInBoundsGEP(SpecialGV, C,
+ C+2);
}
}
// Generate LLVM IR for each BB
for (unsigned i=0;i<func->numBB;i++) {
+ bool unreachable = false;
const struct cli_bc_bb *bb = &func->BB[i];
Builder.SetInsertPoint(BB[i]);
for (unsigned j=0;j<bb->numInsts;j++) {
@@ -507,6 +591,7 @@ public:
case OP_BC_GEPN:
case OP_BC_STORE:
case OP_BC_COPY:
+ case OP_BC_RET:
// these instructions represents operands differently
break;
default:
@@ -624,8 +709,11 @@ public:
break;
}
case OP_BC_RET:
+ {
+ Op0 = convertOperand(func, F->getReturnType(), inst->u.unaryop);
Builder.CreateRet(Op0);
break;
+ }
case OP_BC_RET_VOID:
Builder.CreateRetVoid();
break;
@@ -698,44 +786,110 @@ public:
}
case OP_BC_GEP1:
{
- Value *V = Values[inst->u.binop[0]];
+ Value *V = convertOperand(func, inst, inst->u.binop[0]);
Value *Op = convertOperand(func, I32Ty, inst->u.binop[1]);
- Store(inst->dest, Builder.CreateGEP(V, Op));
+ if (!createGEP(inst->dest, V, &Op, &Op+1))
+ return false;
break;
}
case OP_BC_GEP2:
{
std::vector<Value*> Idxs;
- Value *V = Values[inst->u.three[0]];
+ Value *V = convertOperand(func, inst, inst->u.three[0]);
Idxs.push_back(convertOperand(func, I32Ty, inst->u.three[1]));
Idxs.push_back(convertOperand(func, I32Ty, inst->u.three[2]));
- Store(inst->dest, Builder.CreateGEP(V, Idxs.begin(), Idxs.end()));
+ if (!createGEP(inst->dest, V, Idxs.begin(), Idxs.end()))
+ return false;
break;
}
case OP_BC_GEPN:
{
std::vector<Value*> Idxs;
assert(inst->u.ops.numOps > 1);
- Value *V = Values[inst->u.ops.ops[0]];
+ Value *V = convertOperand(func, inst, inst->u.binop[0]);
for (unsigned a=1;a<inst->u.ops.numOps;a++)
Idxs.push_back(convertOperand(func, I32Ty, inst->u.ops.ops[a]));
- Store(inst->dest, Builder.CreateGEP(V, Idxs.begin(), Idxs.end()));
+ if (!createGEP(inst->dest, V, Idxs.begin(), Idxs.end()))
+ return false;
break;
}
case OP_BC_STORE:
{
Value *Dest = convertOperand(func, inst, inst->u.binop[1]);
const Type *ETy = cast<PointerType>(Dest->getType())->getElementType();
- Builder.CreateStore(getOperand(func, ETy, inst->u.binop[0]),
+ Builder.CreateStore(convertOperand(func, ETy, inst->u.binop[0]),
Dest);
break;
}
case OP_BC_LOAD:
+ {
+ Op0 = Builder.CreateBitCast(Op0,
+ Values[inst->dest]->getType());
Op0 = Builder.CreateLoad(Op0);
Store(inst->dest, Op0);
break;
+ }
+ case OP_BC_MEMSET:
+ {
+ Value *Dst = convertOperand(func, inst, inst->u.three[0]);
+ Value *Val = convertOperand(func, Type::getInt8Ty(Context), inst->u.three[1]);
+ Value *Len = convertOperand(func, Type::getInt32Ty(Context), inst->u.three[2]);
+ CallInst *c = Builder.CreateCall4(FMemset, Dst, Val, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+ break;
+ }
+ case OP_BC_MEMCPY:
+ {
+ Value *Dst = convertOperand(func, inst, inst->u.three[0]);
+ Value *Src = convertOperand(func, inst, inst->u.three[1]);
+ Value *Len = convertOperand(func, Type::getInt32Ty(Context), inst->u.three[2]);
+ CallInst *c = Builder.CreateCall4(FMemcpy, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+ break;
+ }
+ case OP_BC_MEMMOVE:
+ {
+ Value *Dst = convertOperand(func, inst, inst->u.three[0]);
+ Value *Src = convertOperand(func, inst, inst->u.three[1]);
+ Value *Len = convertOperand(func, Type::getInt32Ty(Context), inst->u.three[2]);
+ CallInst *c = Builder.CreateCall4(FMemmove, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+ break;
+ }
+ case OP_BC_MEMCMP:
+ {
+ Value *Dst = convertOperand(func, inst, inst->u.three[0]);
+ Value *Src = convertOperand(func, inst, inst->u.three[1]);
+ Value *Len = convertOperand(func, EE->getTargetData()->getIntPtrType(Context), inst->u.three[2]);
+ CallInst *c = Builder.CreateCall4(FRealMemcmp, Dst, Src, Len,
+ ConstantInt::get(Type::getInt32Ty(Context), 1));
+ c->setTailCall(true);
+ c->setDoesNotThrow();
+ Store(inst->dest, c);
+ break;
+ }
+ case OP_BC_ISBIGENDIAN:
+ Store(inst->dest, WORDS_BIGENDIAN ?
+ ConstantInt::getTrue(Context) :
+ ConstantInt::getFalse(Context));
+ break;
+ case OP_BC_ABORT:
+ if (!unreachable) {
+ CallInst *CI = Builder.CreateCall(FHandler);
+ CI->setDoesNotReturn();
+ CI->setDoesNotThrow();
+ Builder.CreateUnreachable();
+ unreachable = true;
+ }
+ break;
default:
- errs() << "JIT doesn't implement opcode " <<
+ errs() << MODULE << "JIT doesn't implement opcode " <<
inst->opcode << " yet!\n";
return false;
}
@@ -744,6 +898,7 @@ public:
if (verifyFunction(*F, PrintMessageAction)) {
errs() << MODULE << "Verification failed\n";
+ F->dump();
// verification failed
return false;
}
@@ -754,7 +909,7 @@ public:
DEBUG(M->dump());
delete TypeMap;
- std::vector<const Type*> args;
+ args.clear();
args.push_back(PointerType::getUnqual(Type::getInt8Ty(Context)));
FunctionType *Callable = FunctionType::get(Type::getInt32Ty(Context),
args, false);
@@ -866,6 +1021,10 @@ int cli_bytecode_prepare_jit(struct cli_all_bc *bcs)
OurFPM.add(createPromoteMemoryToRegisterPass());
// Delete dead instructions
OurFPM.add(createDeadCodeEliminationPass());
+ // Fold constants
+ OurFPM.add(createConstantPropagationPass());
+ // SimplifyCFG
+ OurFPM.add(createCFGSimplificationPass());
OurFPM.doInitialization();
//TODO: create a wrapper that calls pthread_getspecific
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list