[python] Add some paths where to find test binary
[oota-llvm.git] / bindings / python / llvm / core.py
1 #===- core.py - Python LLVM Bindings -------------------------*- python -*--===#
2 #
3 #                     The LLVM Compiler Infrastructure
4 #
5 # This file is distributed under the University of Illinois Open Source
6 # License. See LICENSE.TXT for details.
7 #
8 #===------------------------------------------------------------------------===#
9
10 from .common import LLVMObject
11 from .common import c_object_p
12 from .common import get_library
13
14 from . import enumerations
15
16 from ctypes import POINTER
17 from ctypes import byref
18 from ctypes import c_char_p
19
20 __all__ = [
21     "lib",
22     "MemoryBuffer",
23 ]
24
25 lib = get_library()
26
27 class OpCode(object):
28     """Represents an individual OpCode enumeration."""
29
30     _value_map = {}
31
32     def __init__(self, name, value):
33         self.name = name
34         self.value = value
35
36     def __repr__(self):
37         return 'OpCode.%s' % self.name
38
39     @staticmethod
40     def from_value(value):
41         """Obtain an OpCode instance from a numeric value."""
42         result = OpCode._value_map.get(value, None)
43
44         if result is None:
45             raise ValueError('Unknown OpCode: %d' % value)
46
47         return result
48
49     @staticmethod
50     def register(name, value):
51         """Registers a new OpCode enumeration.
52
53         This is called by this module for each enumeration defined in
54         enumerations. You should not need to call this outside this module.
55         """
56         if value in OpCode._value_map:
57             raise ValueError('OpCode value already registered: %d' % value)
58
59         opcode = OpCode(name, value)
60         OpCode._value_map[value] = opcode
61         setattr(OpCode, name, opcode)
62
63 class MemoryBuffer(LLVMObject):
64     """Represents an opaque memory buffer."""
65
66     def __init__(self, filename=None):
67         """Create a new memory buffer.
68
69         Currently, we support creating from the contents of a file at the
70         specified filename.
71         """
72         if filename is None:
73             raise Exception("filename argument must be defined")
74
75         memory = c_object_p()
76         out = c_char_p(None)
77
78         result = lib.LLVMCreateMemoryBufferWithContentsOfFile(filename,
79                 byref(memory), byref(out))
80
81         if result:
82             raise Exception("Could not create memory buffer: %s" % out.value)
83
84         LLVMObject.__init__(self, memory, disposer=lib.LLVMDisposeMemoryBuffer)
85
86 def register_library(library):
87     library.LLVMCreateMemoryBufferWithContentsOfFile.argtypes = [c_char_p,
88             POINTER(c_object_p), POINTER(c_char_p)]
89     library.LLVMCreateMemoryBufferWithContentsOfFile.restype = bool
90
91     library.LLVMDisposeMemoryBuffer.argtypes = [MemoryBuffer]
92
93 def register_enumerations():
94     for name, value in enumerations.OpCodes:
95         OpCode.register(name, value)
96
97 register_library(lib)
98 register_enumerations()