summaryrefslogtreecommitdiff
path: root/bindings/go/llvm/bitreader.go
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2015-01-18 16:17:27 +0000
committerDimitry Andric <dim@FreeBSD.org>2015-01-18 16:17:27 +0000
commit67c32a98315f785a9ec9d531c1f571a0196c7463 (patch)
tree4abb9cbeecc7901726dd0b4a37369596c852e9ef /bindings/go/llvm/bitreader.go
parent9f61947910e6ab40de38e6b4034751ef1513200f (diff)
Diffstat (limited to 'bindings/go/llvm/bitreader.go')
-rw-r--r--bindings/go/llvm/bitreader.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/bindings/go/llvm/bitreader.go b/bindings/go/llvm/bitreader.go
new file mode 100644
index 0000000000000..98112a99dd3b7
--- /dev/null
+++ b/bindings/go/llvm/bitreader.go
@@ -0,0 +1,50 @@
+//===- bitreader.go - Bindings for bitreader ------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines bindings for the bitreader component.
+//
+//===----------------------------------------------------------------------===//
+
+package llvm
+
+/*
+#include "llvm-c/BitReader.h"
+#include <stdlib.h>
+*/
+import "C"
+
+import (
+ "errors"
+ "unsafe"
+)
+
+// ParseBitcodeFile parses the LLVM IR (bitcode) in the file with the
+// specified name, and returns a new LLVM module.
+func ParseBitcodeFile(name string) (Module, error) {
+ var buf C.LLVMMemoryBufferRef
+ var errmsg *C.char
+ var cfilename *C.char = C.CString(name)
+ defer C.free(unsafe.Pointer(cfilename))
+ result := C.LLVMCreateMemoryBufferWithContentsOfFile(cfilename, &buf, &errmsg)
+ if result != 0 {
+ err := errors.New(C.GoString(errmsg))
+ C.free(unsafe.Pointer(errmsg))
+ return Module{}, err
+ }
+ defer C.LLVMDisposeMemoryBuffer(buf)
+
+ var m Module
+ if C.LLVMParseBitcode(buf, &m.C, &errmsg) == 0 {
+ return m, nil
+ }
+
+ err := errors.New(C.GoString(errmsg))
+ C.free(unsafe.Pointer(errmsg))
+ return Module{}, err
+}