llvm_c_ext/lib/CoreExt.cpp
changeset 31 5280c546bd37
parent 26 f6379df4b5ea
child 40 d99596797aa1
--- a/llvm_c_ext/lib/CoreExt.cpp	Mon Aug 17 09:08:47 2015 +0100
+++ b/llvm_c_ext/lib/CoreExt.cpp	Mon Aug 17 09:14:38 2015 +0100
@@ -22,6 +22,7 @@
 #include "llvm/IR/Function.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/DebugInfoMetadata.h"
 #include "llvm/IR/Module.h"
 
 using namespace llvm;
@@ -103,3 +104,43 @@
       DebugLoc::get(Line, Col, Scope ? unwrap<MDNode>(Scope) : nullptr,
                     InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr));
 }
+
+LLVMMetadataRef LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref) {
+	return wrap(unwrap(Bref)->getCurrentDebugLocation());
+}
+
+void LLVMModuleAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior, const char *Key, LLVMMetadataRef Val) {
+	unwrap(M)->addModuleFlag((Module::ModFlagBehavior)Behavior, StringRef(Key), unwrap(Val));
+}
+
+LLVMValueRef LLVMMetadataAsValue(LLVMMetadataRef MD) {
+	return LLVMMetadataAsValueInContext(LLVMGetGlobalContext(), MD);
+}
+
+LLVMValueRef LLVMMetadataAsValueInContext(LLVMContextRef C, LLVMMetadataRef MD) {
+	return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD)));
+}
+
+LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Value) {
+	return wrap(ValueAsMetadata::get(unwrap(Value)));
+}
+
+int64_t LLVMValueAsSInt64(LLVMValueRef Value) {
+	if (ConstantInt* CI = dyn_cast<ConstantInt>(unwrap(Value))) {
+		if (CI->getBitWidth() <= 64) {
+			return CI->getSExtValue();
+		}
+	}
+	// Not a constant integer value,
+	return 0;
+}
+
+uint64_t LLVMValueAsUInt64(LLVMValueRef Value) {
+	if (ConstantInt* CI = dyn_cast<ConstantInt>(unwrap(Value))) {
+		if (CI->getBitWidth() <= 64) {
+			return CI->getZExtValue();
+		}
+	}
+	// Not a constant integer value,
+	return 0;
+}