annotate gen/runtime.cpp @ 98:6789050b5ad1 trunk

[svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references. Now uses the DMD _adEq(void[], void[], TypeInfo) runtime function for array equality comparison.
author lindquist
date Wed, 14 Nov 2007 23:39:10 +0100
parents fd32135dca3e
children 1700239cab2e
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 if (global.params.noruntime) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
65 error("No implicit runtime calls allowed with -noruntime option enabled");
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
66 fatal();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
67 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
68
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
69 if (!M) {
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
70 assert(!runtime_failed);
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
71 LLVM_D_InitRuntime();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
72 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
73
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
74 llvm::Function* fn = target->getFunction(name);
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
75 if (fn)
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
76 return fn;
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
77
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
78 fn = M->getFunction(name);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
79 if (!fn) {
98
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
80 printf("Runtime function '%s' was not found\n", name);
6789050b5ad1 [svn r102] Further delayed emission of function bodies to avoid problems with circular-forward-references.
lindquist
parents: 86
diff changeset
81 assert(0);
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
82 //return NULL;
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
83 }
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
84
1
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
85 const llvm::FunctionType* fnty = fn->getFunctionType();
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
86 return llvm::cast<llvm::Function>(target->getOrInsertFunction(name, fnty));
c53b6e3fe49a [svn r5] Initial commit. Most things are very rough.
lindquist
parents:
diff changeset
87 }
40
8b0e809563df [svn r44] Lots of bug fixes.
lindquist
parents: 35
diff changeset
88
52
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
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
91 llvm::GlobalVariable* LLVM_D_GetRuntimeGlobal(llvm::Module* target, const char* name)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
92 {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
93 // 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
94 // could be done and seems like it could be neat too :)
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
95
57
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
96 llvm::GlobalVariable* gv = target->getNamedGlobal(name);
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
97 if (gv) {
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
98 return gv;
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
99 }
a9d29e9f1fed [svn r61] Added support for D-style variadic functions :)
lindquist
parents: 52
diff changeset
100
52
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
101 if (global.params.noruntime) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
102 error("No implicit runtime calls allowed with -noruntime option enabled");
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
103 fatal();
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
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
106 if (!M) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
107 assert(!runtime_failed);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
108 LLVM_D_InitRuntime();
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
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
111 llvm::GlobalVariable* g = M->getNamedGlobal(name);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
112 if (!g) {
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
113 error("Runtime global '%s' was not found", name);
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
114 fatal();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
115 //return NULL;
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
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
118 const llvm::PointerType* t = g->getType();
0c77619e803b [svn r56] Initial support for TypeInfo.
lindquist
parents: 40
diff changeset
119 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
120 }