annotate gen/runtime.c @ 57:a9d29e9f1fed trunk

[svn r61] Added support for D-style variadic functions :)
author lindquist
date Thu, 25 Oct 2007 02:39:53 +0200
parents 0c77619e803b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
1 #include <cassert>
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
2
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
3 #include "gen/llvm.h"
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
4 #include "llvm/Module.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
5 #include "llvm/Bitcode/ReaderWriter.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
6 #include "llvm/Support/MemoryBuffer.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
7
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
8 #include "root.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
9 #include "mars.h"
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
10
4
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
11 #include "gen/runtime.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
12 #include "gen/logger.h"
e116aa1488e6 [svn r8] changed backend includes to always use the gen/<foo>.h prefix
lindquist
parents: 1
diff changeset
13
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
14 static llvm::Module* M = NULL;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
15 static bool runtime_failed = false;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
16
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
17 //////////////////////////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
18
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
19 bool LLVM_D_InitRuntime()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
20 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
21 Logger::println("*** Loading D runtime ***");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
22 LOG_SCOPE;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
23
35
3cfcb944304e [svn r39] * Updated to DMD 1.022 with the exception of:
lindquist
parents: 4
diff changeset
24 if (!global.params.runtimeImppath) {
3cfcb944304e [svn r39] * Updated to DMD 1.022 with the exception of:
lindquist
parents: 4
diff changeset
25 error("You must set the runtime import path with -E");
3cfcb944304e [svn r39] * Updated to DMD 1.022 with the exception of:
lindquist
parents: 4
diff changeset
26 fatal();
3cfcb944304e [svn r39] * Updated to DMD 1.022 with the exception of:
lindquist
parents: 4
diff changeset
27 }
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
28 std::string filename(global.params.runtimeImppath);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
29 filename.append("/llvmdcore.bc");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
30 llvm::MemoryBuffer* buffer = llvm::MemoryBuffer::getFile(filename.c_str(), filename.length());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
31 if (!buffer) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
32 Logger::println("Failed to load runtime library from disk");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
33 runtime_failed = true;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
34 return false;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
35 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
36
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
37 std::string errstr;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
38 bool retval = false;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
39 M = llvm::ParseBitcodeFile(buffer, &errstr);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
40 if (M) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
41 retval = true;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
42 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
43 else {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
44 Logger::println("Failed to load runtime: %s", errstr.c_str());
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
45 runtime_failed = true;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
46 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
47
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
48 delete buffer;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
49 return retval;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
50 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
51
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
52 void LLVM_D_FreeRuntime()
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
53 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
54 if (M) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
55 Logger::println("*** Freeing D runtime ***");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
56 delete M;
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
57 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
58 }
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
59
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
60 //////////////////////////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
61
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
62 llvm::Function* LLVM_D_GetRuntimeFunction(llvm::Module* target, const char* name)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
63 {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
64 // TODO maybe check the target module first, to allow overriding the runtime on a pre module basis?
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 // could be done and seems like it could be neat too :)
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67 if (global.params.noruntime) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
68 error("No implicit runtime calls allowed with -noruntime option enabled");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 fatal();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
71
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72 if (!M) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
73 assert(!runtime_failed);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
74 LLVM_D_InitRuntime();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
75 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
76
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
77 llvm::Function* fn = M->getFunction(name);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
78 if (!fn) {
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
79 error("Runtime function '%s' was not found", name);
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
80 fatal();
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
81 //return NULL;
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
82 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
83
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
84 const llvm::FunctionType* fnty = fn->getFunctionType();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
85 return llvm::cast<llvm::Function>(target->getOrInsertFunction(name, fnty));
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
87
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
88 //////////////////////////////////////////////////////////////////////////////////////////////////
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
89
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
90 llvm::GlobalVariable* LLVM_D_GetRuntimeGlobal(llvm::Module* target, const char* name)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
91 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
92 // TODO maybe check the target module first, to allow overriding the runtime on a pre module basis?
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
93 // could be done and seems like it could be neat too :)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
94
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
95 llvm::GlobalVariable* gv = target->getNamedGlobal(name);
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
96 if (gv) {
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
97 return gv;
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
98 }
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
99
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
100 if (global.params.noruntime) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
101 error("No implicit runtime calls allowed with -noruntime option enabled");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
102 fatal();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
103 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
104
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
105 if (!M) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
106 assert(!runtime_failed);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
107 LLVM_D_InitRuntime();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
108 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
109
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
110 llvm::GlobalVariable* g = M->getNamedGlobal(name);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
111 if (!g) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
112 error("Runtime global '%s' was not found", name);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
113 fatal();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
114 //return NULL;
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
115 }
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
116
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
117 const llvm::PointerType* t = g->getType();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
118 return new llvm::GlobalVariable(t->getElementType(),g->isConstant(),g->getLinkage(),NULL,g->getName(),target);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
119 }