about summary refs log tree commit diff homepage
path: root/lib/Module
diff options
context:
space:
mode:
authorJiri Slaby <jirislaby@gmail.com>2018-05-23 15:01:34 +0200
committerMartinNowack <martin.nowack@gmail.com>2018-10-26 13:31:07 +0100
commit3f70fbfc3d3b0cc2cc9263277979be256a39dd6e (patch)
tree9f4392c56d27b8c055fedc14e013ec335b07b29e /lib/Module
parentb0a6688ca476a8b7a9f28b762bace09bf5a431f1 (diff)
downloadklee-3f70fbfc3d3b0cc2cc9263277979be256a39dd6e.tar.gz
llvm5: Intrinsic::objectsize has three arguments
Modify the IntrinsicCleaner accordingly.

We do not do anything with the third argument as we do not handle the
first argument in any way.

Signed-off-by: Jiri Slaby <jirislaby@gmail.com>
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/IntrinsicCleaner.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp
index ab16a265..ee65be69 100644
--- a/lib/Module/IntrinsicCleaner.cpp
+++ b/lib/Module/IntrinsicCleaner.cpp
@@ -227,13 +227,29 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) {
       case Intrinsic::objectsize: {
         // We don't know the size of an object in general so we replace
         // with 0 or -1 depending on the second argument to the intrinsic.
+#if LLVM_VERSION_CODE >= LLVM_VERSION(5, 0)
+        assert(ii->getNumArgOperands() == 3 && "wrong number of arguments");
+#else
         assert(ii->getNumArgOperands() == 2 && "wrong number of arguments");
+#endif
+
         Value *minArg = ii->getArgOperand(1);
         assert(minArg && "Failed to get second argument");
         ConstantInt *minArgAsInt = dyn_cast<ConstantInt>(minArg);
         assert(minArgAsInt && "Second arg is not a ConstantInt");
         assert(minArgAsInt->getBitWidth() == 1 &&
                "Second argument is not an i1");
+
+#if LLVM_VERSION_CODE >= LLVM_VERSION(5, 0)
+        auto nullArg = ii->getArgOperand(2);
+        assert(nullArg && "Failed to get second argument");
+        auto nullArgAsInt = dyn_cast<ConstantInt>(nullArg);
+        assert(nullArgAsInt && "Third arg is not a ConstantInt");
+        assert(nullArgAsInt->getBitWidth() == 1 &&
+               "Third argument is not an i1");
+	/* TODO should we do something with the 3rd argument? */
+#endif
+
         Value *replacement = NULL;
         IntegerType *intType = dyn_cast<IntegerType>(ii->getType());
         assert(intType && "intrinsic does not have integer return type");