@@ -124,8 +124,7 @@ void MockBuilder::buildExternalFunctionsDefinitions() {
124124 if (nameToAnnotations != annotations.end ()) {
125125 const auto &annotation = nameToAnnotations->second ;
126126
127- buildAnnotationForExternalFunctionArgs (func,
128- annotation.argsStatements );
127+ buildAnnotationForExternalFunctionArgs (func, annotation.argsStatements );
129128 buildAnnotationForExternalFunctionReturn (func,
130129 annotation.returnStatements );
131130 buildAnnotationForExternalFunctionProperties (func, annotation.properties );
@@ -208,28 +207,26 @@ inline llvm::Type *getTypeByOffset(llvm::Type *value,
208207 return current;
209208}
210209
211- inline bool
212- isCorrectStatements (const std::vector<Annotation::StatementPtr> &statements,
213- const llvm::Argument *arg) {
210+ inline bool isCorrectStatements (const std::vector<Statement::Ptr> &statements,
211+ const llvm::Argument *arg) {
214212 return std::any_of (statements.begin (), statements.end (),
215- [arg](const Annotation::StatementPtr &statement) {
213+ [arg](const Statement::Ptr &statement) {
216214 auto argType =
217215 getTypeByOffset (arg->getType (), statement->offset );
218- switch (statement->getStatementKind ()) {
219- case Annotation::StatementKind ::Deref:
220- case Annotation::StatementKind ::InitNull:
216+ switch (statement->getKind ()) {
217+ case Statement::Kind ::Deref:
218+ case Statement::Kind ::InitNull:
221219 return argType->isPointerTy ();
222- case Annotation::StatementKind ::Unknown:
220+ case Statement::Kind ::Unknown:
223221 default :
224222 return true ;
225223 }
226224 });
227225}
228226
229- bool tryAllign (
230- llvm::Function *func,
231- const std::vector<std::vector<Annotation::StatementPtr>> &statements,
232- std::vector<std::vector<Annotation::StatementPtr>> &res) {
227+ bool tryAlign (llvm::Function *func,
228+ const std::vector<std::vector<Statement::Ptr>> &statements,
229+ std::vector<std::vector<Statement::Ptr>> &res) {
233230 if (func->arg_size () == statements.size ()) {
234231 return true ;
235232 }
@@ -254,10 +251,9 @@ bool tryAllign(
254251
255252void MockBuilder::buildAnnotationForExternalFunctionArgs (
256253 llvm::Function *func,
257- const std::vector<std::vector<Annotation::StatementPtr>>
258- &statementsNotAllign) {
259- std::vector<std::vector<Annotation::StatementPtr>> statements;
260- bool flag = tryAllign (func, statementsNotAllign, statements);
254+ const std::vector<std::vector<Statement::Ptr>> &statementsNotAlign) {
255+ std::vector<std::vector<Statement::Ptr>> statements;
256+ bool flag = tryAlign (func, statementsNotAlign, statements);
261257 if (!flag) {
262258 klee_warning (" Annotation: incorrect arguments count function %s " ,
263259 func->getName ().str ().c_str ());
@@ -267,8 +263,8 @@ void MockBuilder::buildAnnotationForExternalFunctionArgs(
267263 const auto arg = func->getArg (i);
268264 for (const auto &statement : statements[i]) {
269265 llvm::Value *elem = goByOffset (arg, statement->offset );
270- switch (statement->getStatementKind ()) {
271- case Annotation::StatementKind ::Deref: {
266+ switch (statement->getKind ()) {
267+ case Statement::Kind ::Deref: {
272268 if (!elem->getType ()->isPointerTy ()) {
273269 klee_error (" Annotation: deref arg not pointer" );
274270 }
@@ -299,8 +295,8 @@ void MockBuilder::buildAnnotationForExternalFunctionArgs(
299295
300296 break ;
301297 }
302- case Annotation::StatementKind ::InitNull:
303- case Annotation::StatementKind ::Unknown:
298+ case Statement::Kind ::InitNull:
299+ case Statement::Kind ::Unknown:
304300 default :
305301 klee_message (" Annotation not implemented" );
306302 break ;
@@ -310,8 +306,7 @@ void MockBuilder::buildAnnotationForExternalFunctionArgs(
310306}
311307
312308void MockBuilder::buildAnnotationForExternalFunctionReturn (
313- llvm::Function *func,
314- const std::vector<Annotation::StatementPtr> &statements) {
309+ llvm::Function *func, const std::vector<Statement::Ptr> &statements) {
315310 auto returnType = func->getReturnType ();
316311 std::string retName = " ret_" + func->getName ().str ();
317312
@@ -321,58 +316,56 @@ void MockBuilder::buildAnnotationForExternalFunctionReturn(
321316 auto *loadInst =
322317 builder->CreateLoad (func->getReturnType (), mockReturnValue, retName);
323318
324- if (!statements.empty ()) {
325- bool initNull = false ;
319+ bool initNull = false ;
326320
327- for (const auto &statement : statements) {
328- switch (statement->getStatementKind ()) {
329- case Annotation::StatementKind::Deref:
330- klee_warning (" unused annotation Deref for return" );
331- break ;
332- case Annotation::StatementKind::InitNull: {
333- if (!returnType->isPointerTy ()) {
334- klee_error (" incorrect type for InitNull" );
335- }
336- initNull = true ;
337- break ;
338- }
339- case Annotation::StatementKind::Unknown:
340- default :
341- klee_message (" Annotation not implemented" );
342- break ;
321+ for (const auto &statement : statements) {
322+ switch (statement->getKind ()) {
323+ case Statement::Kind::Deref:
324+ klee_warning (" Annotation: unused Deref for return function \" %s\" " ,
325+ func->getName ());
326+ break ;
327+ case Statement::Kind::InitNull: {
328+ if (!returnType->isPointerTy ()) {
329+ klee_error (" incorrect type for InitNull" );
343330 }
331+ initNull = true ;
332+ break ;
344333 }
345-
346- if (!initNull) {
347- auto cmpResult = builder->CreateICmpNE (
348- loadInst,
349- llvm::ConstantPointerNull::get (
350- llvm::cast<llvm::PointerType>(loadInst->getType ())),
351- " condition_init_null" + retName);
352-
353- auto *kleeAssumeType = llvm::FunctionType::get (
354- llvm::Type::getVoidTy (mockModule->getContext ()),
355- {llvm::Type::getInt64Ty (mockModule->getContext ())}, false );
356-
357- auto kleeAssumeFunc =
358- mockModule->getOrInsertFunction (" klee_assume" , kleeAssumeType);
359- auto cmpResult64 = builder->CreateZExt (
360- cmpResult, llvm::Type::getInt64Ty (mockModule->getContext ()));
361- builder->CreateCall (kleeAssumeFunc, {cmpResult64});
334+ case Statement::Kind::Unknown:
335+ default :
336+ klee_message (" Annotation not implemented" );
337+ break ;
362338 }
363339 }
364340
341+ if (!initNull) {
342+ auto cmpResult = builder->CreateICmpNE (
343+ loadInst,
344+ llvm::ConstantPointerNull::get (
345+ llvm::cast<llvm::PointerType>(loadInst->getType ())),
346+ " condition_init_null" + retName);
347+
348+ auto *kleeAssumeType = llvm::FunctionType::get (
349+ llvm::Type::getVoidTy (mockModule->getContext ()),
350+ {llvm::Type::getInt64Ty (mockModule->getContext ())}, false );
351+
352+ auto kleeAssumeFunc =
353+ mockModule->getOrInsertFunction (" klee_assume" , kleeAssumeType);
354+ auto cmpResult64 = builder->CreateZExt (
355+ cmpResult, llvm::Type::getInt64Ty (mockModule->getContext ()));
356+ builder->CreateCall (kleeAssumeFunc, {cmpResult64});
357+ }
358+
365359 builder->CreateRet (loadInst);
366360}
367361
368362void MockBuilder::buildAnnotationForExternalFunctionProperties (
369- llvm::Function *func,
370- const std::set<Annotation::PropertyKind> &properties) {
363+ llvm::Function *func, const std::set<Statement::Property> &properties) {
371364 for (const auto &property : properties) {
372365 switch (property) {
373- case Annotation::PropertyKind::Determ :
374- case Annotation::PropertyKind ::Noreturn:
375- case Annotation::PropertyKind ::Unknown:
366+ case Statement::Property::Deterministic :
367+ case Statement::Property ::Noreturn:
368+ case Statement::Property ::Unknown:
376369 default :
377370 klee_message (" Annotation not implemented" );
378371 break ;
0 commit comments