Mercurial > projects > ldc
annotate tools/binding/llvm-ext.cpp @ 1404:11b122f92136
Now that templates instantiations are no longer emitted for all modules that
even blink at them they seem to break due to being linkonce (if compiled with
any optimization level > 0), so let's give them weak linkage instead.
The difference is that unreferenced linkonce symbols can be deleted, while
weak symbols need to be preserved.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Thu, 21 May 2009 15:23:28 +0200 |
parents | 1ba61de8796b |
children |
rev | line source |
---|---|
1273
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
1 // Extension of the LLVM C interface for use with D, some things in the |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
2 // LLVM 2.2 release are kind sparse or even broken... |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
3 // |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
4 // This file is distributed under the University of Illinois Open Source |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
5 // License. See LICENSE.TXT for details. |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
6 // |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
7 #ifndef D11_LLVMCEXT_H |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
8 #define D11_LLVMCEXT_H |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
9 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
10 #include "llvm/Type.h" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
11 #include "llvm/Constants.h" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
12 #include "llvm/Support/CFG.h" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
13 #include "llvm/Target/TargetData.h" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
14 #include "llvm-c/Core.h" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
15 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
16 #include <sstream> |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
17 #include <cstring> |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
18 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
19 using namespace llvm; |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
20 using namespace std; |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
21 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
22 extern "C" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
23 { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
24 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
25 // we need to be able to erase an instruction from its parent |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
26 void LLVMEraseFromParent(LLVMValueRef I) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
27 unwrap<Instruction>(I)->eraseFromParent(); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
28 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
29 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
30 // we need to be able to check if a basic block is terminated |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
31 int LLVMIsTerminated(LLVMBasicBlockRef BB) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
32 return (unwrap(BB)->getTerminator() != NULL); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
33 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
34 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
35 // we need to be able to check if a basic block has any predecessors |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
36 int LLVMHasPredecessors(LLVMBasicBlockRef BB) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
37 BasicBlock* B = unwrap(BB); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
38 return (pred_begin(B) != pred_end(B)); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
39 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
40 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
41 // we need to be able to check if a basic block is empty |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
42 int LLVMIsBasicBlockEmpty(LLVMBasicBlockRef BB) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
43 return unwrap(BB)->empty(); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
44 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
45 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
46 // we need to be able to replace all uses of V with W |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
47 void LLVMReplaceAllUsesWith(LLVMValueRef V, LLVMValueRef W) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
48 unwrap<Value>(V)->replaceAllUsesWith(unwrap<Value>(W)); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
49 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
50 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
51 // sometimes it's nice to be able to dump a type, not only values... |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
52 void LLVMDumpType(LLVMTypeRef T) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
53 unwrap(T)->dump(); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
54 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
55 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
56 LLVMValueRef LLVMGetOrInsertFunction(LLVMModuleRef M, char* Name, LLVMTypeRef Type) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
57 return wrap(unwrap(M)->getOrInsertFunction(Name, unwrap<FunctionType>(Type))); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
58 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
59 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
60 // being able to determine the "kind" of a value is really useful |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
61 unsigned LLVMGetValueKind(LLVMValueRef Value) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
62 return unwrap(Value)->getValueID(); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
63 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
64 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
65 char* LLVMValueToString(LLVMValueRef v) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
66 stringstream ss; |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
67 unwrap(v)->print(ss); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
68 return strdup(ss.str().c_str()); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
69 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
70 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
71 char* LLVMTypeToString(LLVMTypeRef ty) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
72 stringstream ss; |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
73 unwrap(ty)->print(ss); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
74 return strdup(ss.str().c_str()); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
75 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
76 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
77 LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, char* Name) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
78 return wrap(unwrap(M)->getTypeByName(Name)); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
79 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
80 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
81 int LLVMIsTypeAbstract(LLVMTypeRef T) { |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
82 return unwrap(T)->isAbstract(); |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
83 } |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
84 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
85 } // extern "C" |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
86 |
1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
Frits van Bommel <fvbommel wxs.nl>
parents:
diff
changeset
|
87 #endif |