aboutsummaryrefslogtreecommitdiffstats
path: root/bindings/go/llvm/bitreader.go
diff options
context:
space:
mode:
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 0000000..98112a9
--- /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
+}