Mercurial > projects > ldc
annotate gen/llvmhelpers.cpp @ 1372:229e02867307
Fix format-string bugs by adding __attribute__((__format__)) in all applicable
places and fixing all warnings my gcc produced.
Among other things, this should fix several segfaults (including one I just
ran into).
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 17 May 2009 00:15:25 +0200 |
parents | 59c2aa9def23 |
children | e5c5d354c649 |
rev | line source |
---|---|
1206
a5bfed1f6775
Reduce include-order dependencies
Frits van Bommel <fvbommel wxs.nl>
parents:
1189
diff
changeset
|
1 #include "gen/llvmhelpers.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
2 #include "gen/llvm.h" |
284
70c370e97944
[svn r305] Started support for custom class allocators/deallocators. Allocators with more than one argument still need to be fixed.
lindquist
parents:
250
diff
changeset
|
3 #include "llvm/Target/TargetMachineRegistry.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
4 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
5 #include "mars.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
6 #include "init.h" |
339
385a18242485
[svn r360] Another mostly rewrite of DtoArrayInit. Should be much more robust now, and probably faster code generated for the most common cases too!
lindquist
parents:
328
diff
changeset
|
7 #include "id.h" |
365 | 8 #include "expression.h" |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
9 #include "template.h" |
683
b411c41a9716
Only allocate the module file name once. Fixes #90.
Christian Kamm <kamm incasoftware de>
parents:
670
diff
changeset
|
10 #include "module.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
11 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
12 #include "gen/tollvm.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
13 #include "gen/irstate.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
14 #include "gen/runtime.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
15 #include "gen/logger.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
16 #include "gen/arrays.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
17 #include "gen/dvalue.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
18 #include "gen/complex.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
19 #include "gen/classes.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
20 #include "gen/functions.h" |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
21 #include "gen/typeinf.h" |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
22 #include "gen/todebug.h" |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
23 #include "gen/cl_options.h" |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
1206
diff
changeset
|
24 #include "gen/nested.h" |
683
b411c41a9716
Only allocate the module file name once. Fixes #90.
Christian Kamm <kamm incasoftware de>
parents:
670
diff
changeset
|
25 #include "ir/irmodule.h" |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
26 |
482
aa8c050dfd19
Move zero init of padding to DtoInitializer in order to respect void initializers.
Christian Kamm <kamm incasoftware de>
parents:
481
diff
changeset
|
27 #include <stack> |
aa8c050dfd19
Move zero init of padding to DtoInitializer in order to respect void initializers.
Christian Kamm <kamm incasoftware de>
parents:
481
diff
changeset
|
28 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
29 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
30 /*//////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
31 // DYNAMIC MEMORY HELPERS |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
32 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
33 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
34 LLValue* DtoNew(Type* newtype) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
35 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
36 // get runtime function |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
37 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_allocmemoryT"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
38 // get type info |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
39 LLConstant* ti = DtoTypeInfoOf(newtype); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
40 assert(isaPointer(ti)); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
41 // call runtime allocator |
1013
8c73ff5f69e0
Use llvm::CallSite instead of custom CallOrInvoke class.
Frits van Bommel <fvbommel wxs.nl>
parents:
1004
diff
changeset
|
42 LLValue* mem = gIR->CreateCallOrInvoke(fn, ti, ".gc_mem").getInstruction(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
43 // cast |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
44 return DtoBitCast(mem, getPtrToType(DtoType(newtype)), ".gc_mem"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
45 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
46 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
47 void DtoDeleteMemory(LLValue* ptr) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
48 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
49 // get runtime function |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
50 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delmemory"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
51 // build args |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
52 LLSmallVector<LLValue*,1> arg; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
53 arg.push_back(DtoBitCast(ptr, getVoidPtrType(), ".tmp")); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
54 // call |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
55 gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
56 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
57 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
58 void DtoDeleteClass(LLValue* inst) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
59 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
60 // get runtime function |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
61 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delclass"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
62 // build args |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
63 LLSmallVector<LLValue*,1> arg; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
64 arg.push_back(DtoBitCast(inst, fn->getFunctionType()->getParamType(0), ".tmp")); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
65 // call |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
66 gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
67 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
68 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
69 void DtoDeleteInterface(LLValue* inst) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
70 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
71 // get runtime function |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
72 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delinterface"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
73 // build args |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
74 LLSmallVector<LLValue*,1> arg; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
75 arg.push_back(DtoBitCast(inst, fn->getFunctionType()->getParamType(0), ".tmp")); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
76 // call |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
77 gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
78 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
79 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
80 void DtoDeleteArray(DValue* arr) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
81 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
82 // get runtime function |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
83 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_delarray"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
84 // build args |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
85 LLSmallVector<LLValue*,2> arg; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
86 arg.push_back(DtoArrayLen(arr)); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
87 arg.push_back(DtoBitCast(DtoArrayPtr(arr), getVoidPtrType(), ".tmp")); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
88 // call |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
89 gIR->CreateCallOrInvoke(fn, arg.begin(), arg.end()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
90 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
91 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
92 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
93 /*//////////////////////////////////////////////////////////////////////////////////////// |
479
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
94 // ALLOCA HELPERS |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
95 ////////////////////////////////////////////////////////////////////////////////////////*/ |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
96 |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
97 |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
98 llvm::AllocaInst* DtoAlloca(Type* type, const char* name) |
479
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
99 { |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
100 const llvm::Type* lltype = DtoType(type); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
101 llvm::AllocaInst* ai = new llvm::AllocaInst(lltype, name, gIR->topallocapoint()); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
102 ai->setAlignment(type->alignsize()); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
103 return ai; |
479
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
104 } |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
105 |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
106 llvm::AllocaInst* DtoArrayAlloca(Type* type, unsigned arraysize, const char* name) |
479
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
107 { |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
108 const llvm::Type* lltype = DtoType(type); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
109 llvm::AllocaInst* ai = new llvm::AllocaInst( |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
110 lltype, DtoConstUint(arraysize), name, gIR->topallocapoint()); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
111 ai->setAlignment(type->alignsize()); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
112 return ai; |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
113 } |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
114 |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
115 llvm::AllocaInst* DtoRawAlloca(const llvm::Type* lltype, size_t alignment, const char* name) |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
116 { |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
117 llvm::AllocaInst* ai = new llvm::AllocaInst(lltype, name, gIR->topallocapoint()); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
118 if (alignment) |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
119 ai->setAlignment(alignment); |
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
120 return ai; |
479
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
121 } |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
122 |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
123 |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
124 /****************************************************************************************/ |
672eb4893b55
Move AllocaInst creation into DtoAlloca helper. Will enable special zero-init of fp80 reals' padding.
Christian Kamm <kamm incasoftware de>
parents:
468
diff
changeset
|
125 /*//////////////////////////////////////////////////////////////////////////////////////// |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
126 // ASSERT HELPER |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
127 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
128 |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
129 void DtoAssert(Module* M, Loc loc, DValue* msg) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
130 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
131 std::vector<LLValue*> args; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
132 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
133 // func |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
134 const char* fname = msg ? "_d_assert_msg" : "_d_assert"; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
135 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
136 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
137 // msg param |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
138 if (msg) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
139 { |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
140 args.push_back(msg->getRVal()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
141 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
142 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
143 // file param |
936
2ebac4750adb
Removed some dead code.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
934
diff
changeset
|
144 |
2ebac4750adb
Removed some dead code.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
934
diff
changeset
|
145 // we might be generating for an imported template function |
1278
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
146 const char* cur_file = M->srcfile->name->toChars(); |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
147 if (loc.filename && strcmp(loc.filename, cur_file) != 0) |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
148 { |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
149 args.push_back(DtoConstString(loc.filename)); |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
150 } |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
151 else |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
152 { |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
153 IrModule* irmod = getIrModule(M); |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
154 args.push_back(DtoLoad(irmod->fileName)); |
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
155 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
156 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
157 // line param |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
158 LLConstant* c = DtoConstUint(loc.linnum); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
159 args.push_back(c); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
160 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
161 // call |
1013
8c73ff5f69e0
Use llvm::CallSite instead of custom CallOrInvoke class.
Frits van Bommel <fvbommel wxs.nl>
parents:
1004
diff
changeset
|
162 gIR->CreateCallOrInvoke(fn, args.begin(), args.end()); |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
163 |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
164 // end debug info |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
165 if (global.params.symdebug) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
166 DtoDwarfFuncEnd(gIR->func()->decl); |
291
068cb3c60afb
[svn r312] Changed assert codegen to insert an unreachable terminator after the call to the assert function, which currently calls abort().
lindquist
parents:
290
diff
changeset
|
167 |
068cb3c60afb
[svn r312] Changed assert codegen to insert an unreachable terminator after the call to the assert function, which currently calls abort().
lindquist
parents:
290
diff
changeset
|
168 // after assert is always unreachable |
068cb3c60afb
[svn r312] Changed assert codegen to insert an unreachable terminator after the call to the assert function, which currently calls abort().
lindquist
parents:
290
diff
changeset
|
169 gIR->ir->CreateUnreachable(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
170 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
171 |
439
47b64d06eb9f
Enable array bounds check and emit them in IndexExp.
Christian Kamm <kamm incasoftware de>
parents:
435
diff
changeset
|
172 |
47b64d06eb9f
Enable array bounds check and emit them in IndexExp.
Christian Kamm <kamm incasoftware de>
parents:
435
diff
changeset
|
173 /****************************************************************************************/ |
47b64d06eb9f
Enable array bounds check and emit them in IndexExp.
Christian Kamm <kamm incasoftware de>
parents:
435
diff
changeset
|
174 /*//////////////////////////////////////////////////////////////////////////////////////// |
305
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
175 // LABEL HELPER |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
176 ////////////////////////////////////////////////////////////////////////////////////////*/ |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
177 LabelStatement* DtoLabelStatement(Identifier* ident) |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
178 { |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
179 FuncDeclaration* fd = gIR->func()->decl; |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
180 FuncDeclaration::LabelMap::iterator iter = fd->labmap.find(ident->toChars()); |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
181 if (iter == fd->labmap.end()) |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
182 { |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
183 if (fd->returnLabel && fd->returnLabel->ident->equals(ident)) |
305
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
184 { |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
185 assert(fd->returnLabel->statement); |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
186 return fd->returnLabel->statement; |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
187 } |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
188 return NULL; |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
189 } |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
190 return iter->second; |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
191 } |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
192 |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
193 /****************************************************************************************/ |
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
194 /*//////////////////////////////////////////////////////////////////////////////////////// |
302 | 195 // GOTO HELPER |
196 ////////////////////////////////////////////////////////////////////////////////////////*/ | |
1160
7d28dcbff23e
Reenable error for gotos into or out of finally blocks.
Christian Kamm <kamm incasoftware de>
parents:
1151
diff
changeset
|
197 void DtoGoto(Loc loc, Identifier* target, TryFinallyStatement* sourceFinally) |
302 | 198 { |
199 assert(!gIR->scopereturned()); | |
200 | |
305
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
201 LabelStatement* lblstmt = DtoLabelStatement(target); |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
202 if(!lblstmt) { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
203 error(loc, "the label %s does not exist", target->toChars()); |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
204 fatal(); |
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
205 } |
305
2b72433d5c8c
[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents:
304
diff
changeset
|
206 |
304 | 207 // if the target label is inside inline asm, error |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
208 if(lblstmt->asmLabel) { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
209 error(loc, "cannot goto to label %s inside an inline asm block", target->toChars()); |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
210 fatal(); |
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
211 } |
304 | 212 |
353
a7a26f538d6e
[svn r374] Move label target basic block from AST to IRFunction. This is a first step to allowing labels to be emitted multiple times. (for instance within finally blocks)
ChristianK
parents:
339
diff
changeset
|
213 // find target basic block |
355
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
214 std::string labelname = gIR->func()->getScopedLabelName(target->toChars()); |
353
a7a26f538d6e
[svn r374] Move label target basic block from AST to IRFunction. This is a first step to allowing labels to be emitted multiple times. (for instance within finally blocks)
ChristianK
parents:
339
diff
changeset
|
215 llvm::BasicBlock*& targetBB = gIR->func()->labelToBB[labelname]; |
a7a26f538d6e
[svn r374] Move label target basic block from AST to IRFunction. This is a first step to allowing labels to be emitted multiple times. (for instance within finally blocks)
ChristianK
parents:
339
diff
changeset
|
216 if (targetBB == NULL) |
980
ae710cba0884
Clean up the code generated when jumping out of inline asm and make label names more expressive.
Frits van Bommel <fvbommel wxs.nl>
parents:
948
diff
changeset
|
217 targetBB = llvm::BasicBlock::Create("label_" + labelname, gIR->topfunc()); |
302 | 218 |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
219 // emit code for finallys between goto and label |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
220 DtoEnclosingHandlers(loc, lblstmt); |
355
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
221 |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
222 // goto into finally blocks is forbidden by the spec |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
223 // but should work fine |
1160
7d28dcbff23e
Reenable error for gotos into or out of finally blocks.
Christian Kamm <kamm incasoftware de>
parents:
1151
diff
changeset
|
224 if(lblstmt->enclosingFinally != sourceFinally) { |
7d28dcbff23e
Reenable error for gotos into or out of finally blocks.
Christian Kamm <kamm incasoftware de>
parents:
1151
diff
changeset
|
225 error(loc, "spec disallows goto into or out of finally block"); |
357
82af71383b8a
[svn r378] Make some errors fatal to prevent segfaults. Error instead of assert on missing label.
ChristianK
parents:
356
diff
changeset
|
226 fatal(); |
1160
7d28dcbff23e
Reenable error for gotos into or out of finally blocks.
Christian Kamm <kamm incasoftware de>
parents:
1151
diff
changeset
|
227 } |
302 | 228 |
353
a7a26f538d6e
[svn r374] Move label target basic block from AST to IRFunction. This is a first step to allowing labels to be emitted multiple times. (for instance within finally blocks)
ChristianK
parents:
339
diff
changeset
|
229 llvm::BranchInst::Create(targetBB, gIR->scopebb()); |
302 | 230 } |
231 | |
232 /****************************************************************************************/ | |
233 /*//////////////////////////////////////////////////////////////////////////////////////// | |
309 | 234 // TRY-FINALLY, VOLATILE AND SYNCHRONIZED HELPER |
302 | 235 ////////////////////////////////////////////////////////////////////////////////////////*/ |
309 | 236 |
237 void EnclosingSynchro::emitCode(IRState * p) | |
238 { | |
239 if (s->exp) | |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
240 DtoLeaveMonitor(s->exp->toElem(p)->getRVal()); |
309 | 241 else |
242 DtoLeaveCritical(s->llsync); | |
243 } | |
244 | |
245 //////////////////////////////////////////////////////////////////////////////////////// | |
246 | |
247 void EnclosingVolatile::emitCode(IRState * p) | |
248 { | |
249 // store-load barrier | |
250 DtoMemoryBarrier(false, false, true, false); | |
251 } | |
252 | |
253 //////////////////////////////////////////////////////////////////////////////////////// | |
254 | |
255 void EnclosingTryFinally::emitCode(IRState * p) | |
256 { | |
845
d128381e086e
Only emit finalbody if there is one. Fixes #147.
Christian Kamm <kamm incasoftware de>
parents:
812
diff
changeset
|
257 if (tf->finalbody) |
d128381e086e
Only emit finalbody if there is one. Fixes #147.
Christian Kamm <kamm incasoftware de>
parents:
812
diff
changeset
|
258 tf->finalbody->toIR(p); |
309 | 259 } |
260 | |
261 //////////////////////////////////////////////////////////////////////////////////////// | |
262 | |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
263 void DtoEnclosingHandlers(Loc loc, Statement* target) |
302 | 264 { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
265 // labels are a special case: they are not required to enclose the current scope |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
266 // for them we use the enclosing scope handler as a reference point |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
267 LabelStatement* lblstmt = dynamic_cast<LabelStatement*>(target); |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
268 if (lblstmt) |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
269 target = lblstmt->enclosingScopeExit; |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
270 |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
271 // figure out up until what handler we need to emit |
1145
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
272 IrFunction::TargetScopeVec::reverse_iterator targetit = gIR->func()->targetScopes.rbegin(); |
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
273 IrFunction::TargetScopeVec::reverse_iterator it_end = gIR->func()->targetScopes.rend(); |
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
274 while(targetit != it_end) { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
275 if (targetit->s == target) { |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
276 break; |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
277 } |
1145
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
278 ++targetit; |
302 | 279 } |
280 | |
1145
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
281 if (target && targetit == it_end) { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
282 if (lblstmt) |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
283 error(loc, "cannot goto into try, volatile or synchronized statement at %s", target->loc.toChars()); |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
284 else |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
285 error(loc, "internal error, cannot find jump path to statement at %s", target->loc.toChars()); |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
286 return; |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
287 } |
355
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
288 |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
289 // |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
290 // emit code for enclosing handlers |
355
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
291 // |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
292 |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
293 // since the labelstatements possibly inside are private |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
294 // and might already exist push a label scope |
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
295 gIR->func()->pushUniqueLabelScope("enclosing"); |
1145
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
296 IrFunction::TargetScopeVec::reverse_iterator it = gIR->func()->targetScopes.rbegin(); |
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
297 while (it != targetit) { |
1141
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
298 if (it->enclosinghandler) |
f99a3b393c03
Reorganize EnclosingHandlers to require less changes to the frontend and allow us to
Christian Kamm <kamm incasoftware de>
parents:
1088
diff
changeset
|
299 it->enclosinghandler->emitCode(gIR); |
1145
40caa8207b3e
Moved IRTargetScopeS from IRState into IrFunction, fixes #240 .
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1141
diff
changeset
|
300 ++it; |
302 | 301 } |
355
d8357f7004ca
[svn r376] Fix bug with finally blocks and labels. The labels would get emitted multiple times and conflict.
ChristianK
parents:
353
diff
changeset
|
302 gIR->func()->popLabelScope(); |
302 | 303 } |
304 | |
305 /****************************************************************************************/ | |
306 /*//////////////////////////////////////////////////////////////////////////////////////// | |
309 | 307 // SYNCHRONIZED SECTION HELPERS |
308 ////////////////////////////////////////////////////////////////////////////////////////*/ | |
309 | |
310 void DtoEnterCritical(LLValue* g) | |
311 { | |
312 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_criticalenter"); | |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
313 gIR->CreateCallOrInvoke(fn, g); |
309 | 314 } |
315 | |
316 void DtoLeaveCritical(LLValue* g) | |
317 { | |
318 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_criticalexit"); | |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
319 gIR->CreateCallOrInvoke(fn, g); |
309 | 320 } |
321 | |
322 void DtoEnterMonitor(LLValue* v) | |
323 { | |
324 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_monitorenter"); | |
325 v = DtoBitCast(v, fn->getFunctionType()->getParamType(0)); | |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
326 gIR->CreateCallOrInvoke(fn, v); |
309 | 327 } |
328 | |
329 void DtoLeaveMonitor(LLValue* v) | |
330 { | |
331 LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_monitorexit"); | |
332 v = DtoBitCast(v, fn->getFunctionType()->getParamType(0)); | |
315
a9697749e898
[svn r336] Made sure calls within a landing pad area are invokes.
ChristianK
parents:
309
diff
changeset
|
333 gIR->CreateCallOrInvoke(fn, v); |
309 | 334 } |
335 | |
336 /****************************************************************************************/ | |
337 /*//////////////////////////////////////////////////////////////////////////////////////// | |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
338 // ASSIGNMENT HELPER (store this in that) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
339 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
340 |
1018
e8c6dbcd33d1
- Fixed x86-32 C ABI for complex number return values.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1013
diff
changeset
|
341 // is this a good approach at all ? |
e8c6dbcd33d1
- Fixed x86-32 C ABI for complex number return values.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1013
diff
changeset
|
342 |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
343 void DtoAssign(Loc& loc, DValue* lhs, DValue* rhs) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
344 { |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
345 Logger::println("DtoAssign(...);\n"); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
346 LOG_SCOPE; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
347 |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
348 Type* t = lhs->getType()->toBasetype(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
349 Type* t2 = rhs->getType()->toBasetype(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
350 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
351 if (t->ty == Tstruct) { |
295
895e1b50cf2a
[svn r316] Fixed array slice assignments like: int[] arr = ...; arr[] = 42;
lindquist
parents:
294
diff
changeset
|
352 if (!t->equals(t2)) { |
1018
e8c6dbcd33d1
- Fixed x86-32 C ABI for complex number return values.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1013
diff
changeset
|
353 // FIXME: use 'rhs' for something !?! |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
354 DtoAggrZeroInit(lhs->getLVal()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
355 } |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
356 else { |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
357 DtoAggrCopy(lhs->getLVal(), rhs->getRVal()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
358 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
359 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
360 else if (t->ty == Tarray) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
361 // lhs is slice |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
362 if (DSliceValue* s = lhs->isSlice()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
363 if (DSliceValue* s2 = rhs->isSlice()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
364 DtoArrayCopySlices(s, s2); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
365 } |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
366 else if (t->nextOf()->toBasetype()->equals(t2)) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
367 DtoArrayInit(loc, s, rhs); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
368 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
369 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
370 DtoArrayCopyToSlice(s, rhs); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
371 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
372 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
373 // rhs is slice |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
374 else if (DSliceValue* s = rhs->isSlice()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
375 assert(s->getType()->toBasetype() == lhs->getType()->toBasetype()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
376 DtoSetArray(lhs->getLVal(),DtoArrayLen(s),DtoArrayPtr(s)); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
377 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
378 // null |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
379 else if (rhs->isNull()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
380 DtoSetArrayToNull(lhs->getLVal()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
381 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
382 // reference assignment |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
383 else if (t2->ty == Tarray) { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
384 DtoStore(rhs->getRVal(), lhs->getLVal()); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
385 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
386 // some implicitly converting ref assignment |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
387 else { |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
388 DtoSetArray(lhs->getLVal(), DtoArrayLen(rhs), DtoArrayPtr(rhs)); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
389 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
390 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
391 else if (t->ty == Tsarray) { |
709
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
392 // T[n] = T[n] |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
393 if (DtoType(lhs->getType()) == DtoType(rhs->getType())) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
394 DtoStaticArrayCopy(lhs->getLVal(), rhs->getRVal()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
395 } |
709
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
396 // T[n] = T |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
397 else if (t->nextOf()->toBasetype()->equals(t2)) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
398 DtoArrayInit(loc, lhs, rhs); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
399 } |
709
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
400 // T[n] = T[] - generally only generated by frontend in rare cases |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
401 else if (t2->ty == Tarray && t->nextOf()->toBasetype()->equals(t2->nextOf()->toBasetype())) { |
709
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
402 DtoMemCpy(lhs->getLVal(), DtoArrayPtr(rhs), DtoArrayLen(rhs)); |
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
403 } else { |
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
404 assert(0 && "Unimplemented static array assign!"); |
b972fb129d37
Add missing case to DtoAssign for T[n] = T[]. Fixes downs' initializer bug.
Christian Kamm <kamm incasoftware de>
parents:
704
diff
changeset
|
405 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
406 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
407 else if (t->ty == Tdelegate) { |
719
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
408 LLValue* l = lhs->getLVal(); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
409 LLValue* r = rhs->getRVal(); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
410 if (Logger::enabled()) |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
411 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
412 DtoStore(r, l); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
413 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
414 else if (t->ty == Tclass) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
415 assert(t2->ty == Tclass); |
468
45a67b6f1310
Removed the 'needsstorage' thing from Dsymbol. Arguments are not always given storage when applicable. This is not longer treat specially
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
453
diff
changeset
|
416 LLValue* l = lhs->getLVal(); |
45a67b6f1310
Removed the 'needsstorage' thing from Dsymbol. Arguments are not always given storage when applicable. This is not longer treat specially
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
453
diff
changeset
|
417 LLValue* r = rhs->getRVal(); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
418 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
419 { |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
420 Logger::cout() << "l : " << *l << '\n'; |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
421 Logger::cout() << "r : " << *r << '\n'; |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
422 } |
468
45a67b6f1310
Removed the 'needsstorage' thing from Dsymbol. Arguments are not always given storage when applicable. This is not longer treat specially
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
453
diff
changeset
|
423 r = DtoBitCast(r, l->getType()->getContainedType(0)); |
45a67b6f1310
Removed the 'needsstorage' thing from Dsymbol. Arguments are not always given storage when applicable. This is not longer treat specially
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
453
diff
changeset
|
424 DtoStore(r, l); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
425 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
426 else if (t->iscomplex()) { |
1151
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
427 LLValue* dst = lhs->getLVal(); |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
428 LLValue* src = DtoCast(loc, rhs, lhs->getType())->getRVal(); |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
429 DtoStore(src, dst); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
430 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
431 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
432 LLValue* l = lhs->getLVal(); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
433 LLValue* r = rhs->getRVal(); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
434 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
435 Logger::cout() << "assign\nlhs: " << *l << "rhs: " << *r << '\n'; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
436 const LLType* lit = l->getType()->getContainedType(0); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
437 if (r->getType() != lit) { |
1151
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
438 r = DtoCast(loc, rhs, lhs->getType())->getRVal(); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
439 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
440 Logger::cout() << "really assign\nlhs: " << *l << "rhs: " << *r << '\n'; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
441 assert(r->getType() == l->getType()->getContainedType(0)); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
442 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
443 gIR->ir->CreateStore(r, l); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
444 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
445 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
446 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
447 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
448 /*//////////////////////////////////////////////////////////////////////////////////////// |
372
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
449 // NULL VALUE HELPER |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
450 ////////////////////////////////////////////////////////////////////////////////////////*/ |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
451 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
452 DValue* DtoNullValue(Type* type) |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
453 { |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
454 Type* basetype = type->toBasetype(); |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
455 TY basety = basetype->ty; |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
456 const LLType* lltype = DtoType(basetype); |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
457 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
458 // complex, needs to be first since complex are also floating |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
459 if (basetype->iscomplex()) |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
460 { |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
461 const LLType* basefp = DtoComplexBaseType(basetype); |
585
fbb1a366cfbc
Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
462 LLValue* res = DtoAggrPair(DtoType(type), LLConstant::getNullValue(basefp), LLConstant::getNullValue(basefp)); |
fbb1a366cfbc
Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
463 return new DImValue(type, res); |
372
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
464 } |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
465 // integer, floating, pointer and class have no special representation |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
466 else if (basetype->isintegral() || basetype->isfloating() || basety == Tpointer || basety == Tclass) |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
467 { |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
468 return new DConstValue(type, LLConstant::getNullValue(lltype)); |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
469 } |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
470 // dynamic array |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
471 else if (basety == Tarray) |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
472 { |
373 | 473 LLValue* len = DtoConstSize_t(0); |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
474 LLValue* ptr = getNullPtr(getPtrToType(DtoType(basetype->nextOf()))); |
373 | 475 return new DSliceValue(type, len, ptr); |
372
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
476 } |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
477 // delegate |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
478 else if (basety == Tdelegate) |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
479 { |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
480 return new DNullValue(type, LLConstant::getNullValue(lltype)); |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
481 } |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
482 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
483 // unknown |
994
18ad5601dff7
Use LLVM OStream wrapper instead of <iostream> in the logger.
Frits van Bommel <fvbommel wxs.nl>
parents:
980
diff
changeset
|
484 llvm::cout << "unsupported: null value for " << type->toChars() << '\n'; |
372
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
485 assert(0); |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
486 return 0; |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
487 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
488 } |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
489 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
490 |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
491 /****************************************************************************************/ |
83ade4f4025a
[svn r393] Started implementation for DtoNullValue.
ChristianK
parents:
370
diff
changeset
|
492 /*//////////////////////////////////////////////////////////////////////////////////////// |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
493 // CASTING HELPERS |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
494 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
495 |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
496 DValue* DtoCastInt(Loc& loc, DValue* val, Type* _to) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
497 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
498 const LLType* tolltype = DtoType(_to); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
499 |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
500 Type* to = _to->toBasetype(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
501 Type* from = val->getType()->toBasetype(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
502 assert(from->isintegral()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
503 |
611
83ca663ecc20
Backed out changeset 1b62222581fb
Christian Kamm <kamm incasoftware de>
parents:
610
diff
changeset
|
504 size_t fromsz = from->size(); |
83ca663ecc20
Backed out changeset 1b62222581fb
Christian Kamm <kamm incasoftware de>
parents:
610
diff
changeset
|
505 size_t tosz = to->size(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
506 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
507 LLValue* rval = val->getRVal(); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
508 if (rval->getType() == tolltype) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
509 return new DImValue(_to, rval); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
510 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
511 |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
512 if (to->ty == Tbool) { |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
513 LLValue* zero = LLConstantInt::get(rval->getType(), 0, false); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
514 rval = gIR->ir->CreateICmpNE(rval, zero, "tmp"); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
515 } |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
516 else if (to->isintegral()) { |
757
2c730d530c98
Special case DtoCastInt for bool.
Christian Kamm <kamm incasoftware de>
parents:
747
diff
changeset
|
517 if (fromsz < tosz || from->ty == Tbool) { |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
518 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
519 Logger::cout() << "cast to: " << *tolltype << '\n'; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
520 if (from->isunsigned() || from->ty == Tbool) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
521 rval = new llvm::ZExtInst(rval, tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
522 } else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
523 rval = new llvm::SExtInst(rval, tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
524 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
525 } |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
526 else if (fromsz > tosz) { |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
527 rval = new llvm::TruncInst(rval, tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
528 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
529 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
530 rval = DtoBitCast(rval, tolltype); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
531 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
532 } |
359 | 533 else if (to->iscomplex()) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
534 return DtoComplex(loc, to, val); |
359 | 535 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
536 else if (to->isfloating()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
537 if (from->isunsigned()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
538 rval = new llvm::UIToFPInst(rval, tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
539 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
540 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
541 rval = new llvm::SIToFPInst(rval, tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
542 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
543 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
544 else if (to->ty == Tpointer) { |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
545 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
546 Logger::cout() << "cast pointer: " << *tolltype << '\n'; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
547 rval = gIR->ir->CreateIntToPtr(rval, tolltype, "tmp"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
548 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
549 else { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
550 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), _to->toChars()); |
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
551 fatal(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
552 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
553 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
554 return new DImValue(_to, rval); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
555 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
556 |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
557 DValue* DtoCastPtr(Loc& loc, DValue* val, Type* to) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
558 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
559 const LLType* tolltype = DtoType(to); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
560 |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
561 Type* totype = to->toBasetype(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
562 Type* fromtype = val->getType()->toBasetype(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
563 assert(fromtype->ty == Tpointer || fromtype->ty == Tfunction); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
564 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
565 LLValue* rval; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
566 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
567 if (totype->ty == Tpointer || totype->ty == Tclass) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
568 LLValue* src = val->getRVal(); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
569 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
570 Logger::cout() << "src: " << *src << "to type: " << *tolltype << '\n'; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
571 rval = DtoBitCast(src, tolltype); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
572 } |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
573 else if (totype->ty == Tbool) { |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
574 LLValue* src = val->getRVal(); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
575 LLValue* zero = LLConstant::getNullValue(src->getType()); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
576 rval = gIR->ir->CreateICmpNE(src, zero, "tmp"); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
577 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
578 else if (totype->isintegral()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
579 rval = new llvm::PtrToIntInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
580 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
581 else { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
582 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), to->toChars()); |
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
583 fatal(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
584 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
585 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
586 return new DImValue(to, rval); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
587 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
588 |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
589 DValue* DtoCastFloat(Loc& loc, DValue* val, Type* to) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
590 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
591 if (val->getType() == to) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
592 return val; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
593 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
594 const LLType* tolltype = DtoType(to); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
595 |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
596 Type* totype = to->toBasetype(); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
597 Type* fromtype = val->getType()->toBasetype(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
598 assert(fromtype->isfloating()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
599 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
600 size_t fromsz = fromtype->size(); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
601 size_t tosz = totype->size(); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
602 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
603 LLValue* rval; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
604 |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
605 if (totype->ty == Tbool) { |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
606 rval = val->getRVal(); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
607 LLValue* zero = LLConstant::getNullValue(rval->getType()); |
784
a45179dfaa43
Fix float->bool, #130. Thanks fvbommel.
Christian Kamm <kamm incasoftware de>
parents:
778
diff
changeset
|
608 rval = gIR->ir->CreateFCmpUNE(rval, zero, "tmp"); |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
609 } |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
610 else if (totype->iscomplex()) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
611 return DtoComplex(loc, to, val); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
612 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
613 else if (totype->isfloating()) { |
445
cc40db549aea
Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
442
diff
changeset
|
614 if (fromsz == tosz) { |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
615 rval = val->getRVal(); |
445
cc40db549aea
Changed the handling of variadic intrinsics a bit.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
442
diff
changeset
|
616 assert(rval->getType() == tolltype); |
359 | 617 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
618 else if (fromsz < tosz) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
619 rval = new llvm::FPExtInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
620 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
621 else if (fromsz > tosz) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
622 rval = new llvm::FPTruncInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
623 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
624 else { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
625 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), to->toChars()); |
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
626 fatal(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
627 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
628 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
629 else if (totype->isintegral()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
630 if (totype->isunsigned()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
631 rval = new llvm::FPToUIInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
632 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
633 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
634 rval = new llvm::FPToSIInst(val->getRVal(), tolltype, "tmp", gIR->scopebb()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
635 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
636 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
637 else { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
638 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), to->toChars()); |
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
639 fatal(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
640 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
641 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
642 return new DImValue(to, rval); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
643 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
644 |
419
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
645 DValue* DtoCastDelegate(Loc& loc, DValue* val, Type* to) |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
646 { |
719
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
647 if (to->toBasetype()->ty == Tdelegate) |
419
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
648 { |
719
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
649 return DtoPaintType(loc, val, to); |
419
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
650 } |
778
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
651 else if (to->toBasetype()->ty == Tbool) |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
652 { |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
653 return new DImValue(to, DtoDelegateEquals(TOKnotequal, val->getRVal(), NULL)); |
4adf0f742896
Get rid of DtoBoolean - use DtoCast(... Type::tbool) instead.
Christian Kamm <kamm incasoftware de>
parents:
773
diff
changeset
|
654 } |
419
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
655 else |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
656 { |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
657 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), to->toChars()); |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
658 fatal(); |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
659 } |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
660 } |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
661 |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
662 DValue* DtoCast(Loc& loc, DValue* val, Type* to) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
663 { |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
664 Type* fromtype = val->getType()->toBasetype(); |
1151
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
665 Type* totype = to->toBasetype(); |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
666 if (fromtype->equals(totype)) |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
667 return val; |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
668 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
669 Logger::println("Casting from '%s' to '%s'", fromtype->toChars(), to->toChars()); |
1151
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
670 LOG_SCOPE; |
3cf0066e6faf
- Versioned Expresssion::toElem with #if IN_DMD/IN_LLVM.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1148
diff
changeset
|
671 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
672 if (fromtype->isintegral()) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
673 return DtoCastInt(loc, val, to); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
674 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
675 else if (fromtype->iscomplex()) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
676 return DtoCastComplex(loc, val, to); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
677 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
678 else if (fromtype->isfloating()) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
679 return DtoCastFloat(loc, val, to); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
680 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
681 else if (fromtype->ty == Tclass) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
682 return DtoCastClass(val, to); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
683 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
684 else if (fromtype->ty == Tarray || fromtype->ty == Tsarray) { |
424
c8d98ccad0cc
Error if static array is cast to an array such that oldarraysize % newelemsize != 0.
Christian Kamm <kamm incasoftware de>
parents:
419
diff
changeset
|
685 return DtoCastArray(loc, val, to); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
686 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
687 else if (fromtype->ty == Tpointer || fromtype->ty == Tfunction) { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
688 return DtoCastPtr(loc, val, to); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
689 } |
419
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
690 else if (fromtype->ty == Tdelegate) { |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
691 return DtoCastDelegate(loc, val, to); |
023fa78c1203
Fixed delegate casts.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
399
diff
changeset
|
692 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
693 else { |
399
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
694 error(loc, "invalid cast from '%s' to '%s'", val->getType()->toChars(), to->toChars()); |
0e6b4d65d3f8
Give error messages for invalid casts.
Christian Kamm <kamm incasoftware de>
parents:
373
diff
changeset
|
695 fatal(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
696 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
697 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
698 |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
699 ////////////////////////////////////////////////////////////////////////////////////////// |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
700 |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
701 DValue* DtoPaintType(Loc& loc, DValue* val, Type* to) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
702 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
703 Type* from = val->getType()->toBasetype(); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
704 Logger::println("repainting from '%s' to '%s'", from->toChars(), to->toChars()); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
705 |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
706 if (from->ty == Tarray) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
707 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
708 Type* at = to->toBasetype(); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
709 assert(at->ty == Tarray); |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
710 Type* elem = at->nextOf()->pointerTo(); |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
711 if (DSliceValue* slice = val->isSlice()) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
712 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
713 return new DSliceValue(to, slice->len, DtoBitCast(slice->ptr, DtoType(elem))); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
714 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
715 else if (val->isLVal()) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
716 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
717 LLValue* ptr = val->getLVal(); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
718 ptr = DtoBitCast(ptr, DtoType(at->pointerTo())); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
719 return new DVarValue(to, ptr); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
720 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
721 else |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
722 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
723 LLValue *len, *ptr; |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
724 len = DtoArrayLen(val); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
725 ptr = DtoArrayPtr(val); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
726 ptr = DtoBitCast(ptr, DtoType(elem)); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
727 return new DImValue(to, DtoAggrPair(len, ptr, "tmp")); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
728 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
729 } |
719
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
730 else if (from->ty == Tdelegate) |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
731 { |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
732 Type* dgty = to->toBasetype(); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
733 assert(dgty->ty == Tdelegate); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
734 if (val->isLVal()) |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
735 { |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
736 LLValue* ptr = val->getLVal(); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
737 assert(isaPointer(ptr)); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
738 ptr = DtoBitCast(ptr, getPtrToType(DtoType(dgty))); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
739 if (Logger::enabled()) |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
740 Logger::cout() << "dg ptr: " << *ptr << '\n'; |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
741 return new DVarValue(to, ptr); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
742 } |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
743 else |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
744 { |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
745 LLValue* dg = val->getRVal(); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
746 LLValue* context = gIR->ir->CreateExtractValue(dg, 0, ".context"); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
747 LLValue* funcptr = gIR->ir->CreateExtractValue(dg, 1, ".funcptr"); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
748 funcptr = DtoBitCast(funcptr, DtoType(dgty)->getContainedType(1)); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
749 LLValue* aggr = DtoAggrPair(context, funcptr, "tmp"); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
750 if (Logger::enabled()) |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
751 Logger::cout() << "dg: " << *aggr << '\n'; |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
752 return new DImValue(to, aggr); |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
753 } |
7261ff0f95ff
Implemented first class delegates. closes #101
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
715
diff
changeset
|
754 } |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
755 else if (from->ty == Tpointer || from->ty == Tclass || from->ty == Taarray) |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
756 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
757 Type* b = to->toBasetype(); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
758 assert(b->ty == Tpointer || b->ty == Tclass || b->ty == Taarray); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
759 LLValue* ptr = DtoBitCast(val->getRVal(), DtoType(b)); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
760 return new DImValue(to, ptr); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
761 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
762 else |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
763 { |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
764 assert(!val->isLVal()); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
765 assert(DtoType(to) == DtoType(to)); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
766 return new DImValue(to, val->getRVal()); |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
767 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
768 } |
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
769 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
770 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
771 /*//////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
772 // TEMPLATE HELPERS |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
773 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
774 |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
775 TemplateInstance* DtoIsTemplateInstance(Dsymbol* s) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
776 { |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
777 if (!s) return NULL; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
778 if (s->isTemplateInstance() && !s->isTemplateMixin()) |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
779 return s->isTemplateInstance(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
780 else if (s->parent) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
781 return DtoIsTemplateInstance(s->parent); |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
782 return NULL; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
783 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
784 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
785 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
786 /*//////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
787 // PROCESSING QUEUE HELPERS |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
788 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
789 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
790 void DtoResolveDsymbol(Dsymbol* dsym) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
791 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
792 if (StructDeclaration* sd = dsym->isStructDeclaration()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
793 DtoResolveStruct(sd); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
794 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
795 else if (ClassDeclaration* cd = dsym->isClassDeclaration()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
796 DtoResolveClass(cd); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
797 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
798 else if (FuncDeclaration* fd = dsym->isFuncDeclaration()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
799 DtoResolveFunction(fd); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
800 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
801 else if (TypeInfoDeclaration* fd = dsym->isTypeInfoDeclaration()) { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
802 DtoResolveTypeInfo(fd); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
803 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
804 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
805 error(dsym->loc, "unsupported dsymbol: %s", dsym->toChars()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
806 assert(0 && "unsupported dsymbol for DtoResolveDsymbol"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
807 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
808 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
809 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
810 ////////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
811 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
812 void DtoConstInitGlobal(VarDeclaration* vd) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
813 { |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
814 vd->codegen(Type::sir); |
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
815 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
816 if (vd->ir.initialized) return; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
817 vd->ir.initialized = gIR->dmodule; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
818 |
1278
8fb39f7f1a7c
Fixed file name in imported mixins containing assertions.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1271
diff
changeset
|
819 Logger::println("DtoConstInitGlobal(%s) @ %s", vd->toChars(), vd->loc.toChars()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
820 LOG_SCOPE; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
821 |
798
92ea3015ace6
Use toParent instead of toParent2 to determine whether inside a function body.
Christian Kamm <kamm incasoftware de>
parents:
797
diff
changeset
|
822 Dsymbol* par = vd->toParent(); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
823 |
920
545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
918
diff
changeset
|
824 // build the initializer |
545f54041d91
Implemented proper support for naked asm using llvm module level asm. Still not 100% complete, but already 1000 times better that what we had before. Don's BignumX86 implementation from Tango (when turned into a standalone unittest) seems to fully work with no changes, and great performance :)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
918
diff
changeset
|
825 LLConstant* initVal = DtoConstInitializer(vd->loc, vd->type, vd->init); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
826 |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
827 // set the initializer if appropriate |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
828 IrGlobal* glob = vd->ir.irGlobal; |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
829 llvm::GlobalVariable* gvar = llvm::cast<llvm::GlobalVariable>(glob->value); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
830 |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
831 // refine the global's opaque type to the type of the initializer |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
832 llvm::cast<LLOpaqueType>(glob->type.get())->refineAbstractTypeTo(initVal->getType()); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
833 |
812
6c2ff06c4201
Fixed a nasty bug with how interface vtables for class initializers were output, causing some class fields to be skipped.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
803
diff
changeset
|
834 assert(!glob->constInit); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
835 glob->constInit = initVal; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
836 |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
837 // assign the initializer |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
838 llvm::GlobalVariable* globalvar = llvm::cast<llvm::GlobalVariable>(glob->value); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
839 |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
840 if (!(vd->storage_class & STCextern) && mustDefineSymbol(vd)) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
841 { |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
842 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
843 { |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
844 Logger::println("setting initializer"); |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
845 Logger::cout() << "global: " << *gvar << '\n'; |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
846 Logger::cout() << "init: " << *initVal << '\n'; |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
847 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
848 |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
849 gvar->setInitializer(initVal); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
850 |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
851 // do debug info |
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
852 if (global.params.symdebug) |
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
853 { |
946
1714836f2c0b
Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents:
945
diff
changeset
|
854 LLGlobalVariable* gv = DtoDwarfGlobalVariable(gvar, vd).getGV(); |
250
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
855 // keep a reference so GDCE doesn't delete it ! |
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
856 gIR->usedArray.push_back(llvm::ConstantExpr::getBitCast(gv, getVoidPtrType())); |
fc9c1a0eabbd
[svn r267] Fixed debug info for global variables.
lindquist
parents:
244
diff
changeset
|
857 } |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
858 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
859 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
860 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
861 /****************************************************************************************/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
862 /*//////////////////////////////////////////////////////////////////////////////////////// |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
863 // DECLARATION EXP HELPER |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
864 ////////////////////////////////////////////////////////////////////////////////////////*/ |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
865 DValue* DtoDeclarationExp(Dsymbol* declaration) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
866 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
867 Logger::print("DtoDeclarationExp: %s\n", declaration->toChars()); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
868 LOG_SCOPE; |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
869 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
870 // variable declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
871 if (VarDeclaration* vd = declaration->isVarDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
872 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
873 Logger::println("VarDeclaration"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
874 |
648
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
875 // if aliassym is set, this VarDecl is redone as an alias to another symbol |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
876 // this seems to be done to rewrite Tuple!(...) v; |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
877 // as a TupleDecl that contains a bunch of individual VarDecls |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
878 if (vd->aliassym) |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
879 return DtoDeclarationExp(vd->aliassym); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
880 |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
881 // static |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
882 if (vd->isDataseg()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
883 { |
1147
dbe4af57b240
Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1145
diff
changeset
|
884 vd->codegen(Type::sir); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
885 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
886 else |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
887 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
888 if (global.params.llvmAnnotate) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
889 DtoAnnotation(declaration->toChars()); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
890 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
891 Logger::println("vdtype = %s", vd->type->toChars()); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
892 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
893 // referenced by nested delegate? |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
894 #if DMDV2 |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
895 if (vd->nestedrefs.dim) { |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
896 #else |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
897 if (vd->nestedref) { |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
898 #endif |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
899 Logger::println("has nestedref set"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
900 assert(vd->ir.irLocal); |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
901 |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
1206
diff
changeset
|
902 DtoNestedInit(vd); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
903 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
904 // normal stack variable, allocate storage on the stack if it has not already been done |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
905 else if(!vd->ir.irLocal) { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
906 const LLType* lltype = DtoType(vd->type); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
907 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
908 llvm::Value* allocainst; |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
909 if(gTargetData->getTypeSizeInBits(lltype) == 0) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
910 allocainst = llvm::ConstantPointerNull::get(getPtrToType(lltype)); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
911 else |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
912 allocainst = DtoAlloca(vd->type, vd->toChars()); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
913 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
914 //allocainst->setAlignment(vd->type->alignsize()); // TODO |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
915 vd->ir.irLocal = new IrLocal(vd); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
916 vd->ir.irLocal->value = allocainst; |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
917 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
918 if (global.params.symdebug) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
919 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
920 DtoDwarfLocalVariable(allocainst, vd); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
921 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
922 } |
486
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
923 else |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
924 { |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
925 assert(vd->ir.irLocal->value); |
a34078905d01
Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
483
diff
changeset
|
926 } |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
927 |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
928 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
929 Logger::cout() << "llvm value for decl: " << *vd->ir.irLocal->value << '\n'; |
482
aa8c050dfd19
Move zero init of padding to DtoInitializer in order to respect void initializers.
Christian Kamm <kamm incasoftware de>
parents:
481
diff
changeset
|
930 DValue* ie = DtoInitializer(vd->ir.irLocal->value, vd->init); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
931 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
932 |
585
fbb1a366cfbc
Complex number should now follow the D ABI on x86. They're also treated as first class values now. Big change.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
583
diff
changeset
|
933 return new DVarValue(vd->type, vd, vd->ir.getIrValue()); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
934 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
935 // struct declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
936 else if (StructDeclaration* s = declaration->isStructDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
937 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
938 Logger::println("StructDeclaration"); |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
939 s->codegen(Type::sir); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
940 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
941 // function declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
942 else if (FuncDeclaration* f = declaration->isFuncDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
943 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
944 Logger::println("FuncDeclaration"); |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
945 f->codegen(Type::sir); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
946 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
947 // alias declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
948 else if (AliasDeclaration* a = declaration->isAliasDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
949 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
950 Logger::println("AliasDeclaration - no work"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
951 // do nothing |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
952 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
953 // enum |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
954 else if (EnumDeclaration* e = declaration->isEnumDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
955 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
956 Logger::println("EnumDeclaration - no work"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
957 // do nothing |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
958 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
959 // class |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
960 else if (ClassDeclaration* e = declaration->isClassDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
961 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
962 Logger::println("ClassDeclaration"); |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
963 e->codegen(Type::sir); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
964 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
965 // typedef |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
966 else if (TypedefDeclaration* tdef = declaration->isTypedefDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
967 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
968 Logger::println("TypedefDeclaration"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
969 DtoTypeInfoOf(tdef->type, false); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
970 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
971 // attribute declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
972 else if (AttribDeclaration* a = declaration->isAttribDeclaration()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
973 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
974 Logger::println("AttribDeclaration"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
975 for (int i=0; i < a->decl->dim; ++i) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
976 { |
590
1ecb43102d12
Allow VarDecl inside AttributeDecl inside DeclExp.
Christian Kamm <kamm incasoftware de>
parents:
585
diff
changeset
|
977 DtoDeclarationExp((Dsymbol*)a->decl->data[i]); |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
978 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
979 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
980 // mixin declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
981 else if (TemplateMixin* m = declaration->isTemplateMixin()) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
982 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
983 Logger::println("TemplateMixin"); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
984 for (int i=0; i < m->members->dim; ++i) |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
985 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
986 Dsymbol* mdsym = (Dsymbol*)m->members->data[i]; |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
987 DtoDeclarationExp(mdsym); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
988 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
989 } |
648
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
990 // tuple declaration |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
991 else if (TupleDeclaration* tupled = declaration->isTupleDeclaration()) |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
992 { |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
993 Logger::println("TupleDeclaration"); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
994 if(!tupled->isexp) { |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
995 error(declaration->loc, "don't know how to handle non-expression tuple decls yet"); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
996 assert(0); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
997 } |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
998 |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
999 assert(tupled->objects); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1000 for (int i=0; i < tupled->objects->dim; ++i) |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1001 { |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1002 DsymbolExp* exp = (DsymbolExp*)tupled->objects->data[i]; |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1003 DtoDeclarationExp(exp->s); |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1004 } |
8d850fa25713
Fix VarDecls for tuples. Closes #99.
Christian Kamm <kamm incasoftware de>
parents:
639
diff
changeset
|
1005 } |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1006 // unsupported declaration |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1007 else |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1008 { |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1009 error(declaration->loc, "Unimplemented Declaration type for DeclarationExp. kind: %s", declaration->kind()); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1010 assert(0); |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1011 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1012 return NULL; |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1013 } |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1014 |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1015 // does pretty much the same as DtoDeclarationExp, except it doesn't initialize, and only handles var declarations |
1185
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1016 LLValue* DtoRawVarDeclaration(VarDeclaration* var, LLValue* addr) |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1017 { |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1018 // we don't handle globals with this one |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1019 assert(!var->isDataseg()); |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1020 |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1021 // we don't handle aliases either |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1022 assert(!var->aliassym); |
1189
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1023 |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1024 // alloca if necessary |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1025 LLValue* allocaval = NULL; |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1026 if (!addr && (!var->ir.irLocal || !var->ir.irLocal->value)) |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1027 { |
1350
15e9762bb620
Adds explicit alignment information for alloca instructions in general, there's a few cases that still needs to be looked at but this should catch the majority. Fixes ticket #293 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1279
diff
changeset
|
1028 addr = DtoAlloca(var->type, var->toChars()); |
1189
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1029 |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1030 // add debug info |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1031 if (global.params.symdebug) |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1032 DtoDwarfLocalVariable(addr, var); |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1033 } |
773
5696a7167b21
Fix RawVarDecl double codegen bug. Thanks to downs for the testcase.
Christian Kamm <kamm incasoftware de>
parents:
758
diff
changeset
|
1034 |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1035 // referenced by nested function? |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1036 #if DMDV2 |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1037 if (var->nestedrefs.dim) |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1038 #else |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1039 if (var->nestedref) |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1040 #endif |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1041 { |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1042 assert(var->ir.irLocal); |
1185
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1043 if(!var->ir.irLocal->value) |
1189
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1044 { |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1045 assert(addr); |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1046 var->ir.irLocal->value = addr; |
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1047 } |
1185
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1048 else |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1049 assert(!addr || addr == var->ir.irLocal->value); |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1050 |
1207
83d3b25c2213
Isolate all knowledge of what a function's nested context looks like in a
Frits van Bommel <fvbommel wxs.nl>
parents:
1206
diff
changeset
|
1051 DtoNestedInit(var); |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1052 } |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1053 // normal local variable |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1054 else |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1055 { |
1185
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1056 // if this already has storage, it must've been handled already |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1057 if (var->ir.irLocal && var->ir.irLocal->value) { |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1058 assert(!addr || addr == var->ir.irLocal->value); |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1059 return var->ir.irLocal->value; |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1060 } |
8baf611f0009
Fix nested references to 'ref' foreach variables.
Frits van Bommel <fvbommel wxs.nl>
parents:
1167
diff
changeset
|
1061 |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1062 assert(!var->ir.isSet()); |
1189
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1063 assert(addr); |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1064 var->ir.irLocal = new IrLocal(var); |
1189
c0091f3b72f1
Make sure debug info is only declared once per alloca.
Christian Kamm <kamm incasoftware de>
parents:
1185
diff
changeset
|
1065 var->ir.irLocal->value = addr; |
747
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1066 } |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1067 |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1068 // return the alloca |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1069 return var->ir.irLocal->value; |
46d0755451a4
Added DtoRawVarDeclaration routine to handle special variables in some statements.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
719
diff
changeset
|
1070 } |
433
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1071 |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1072 /****************************************************************************************/ |
b5f55f471e0b
Move DeclarationExp code into a helper function so it can call itself for template mixin members.
Christian Kamm <kamm incasoftware de>
parents:
424
diff
changeset
|
1073 /*//////////////////////////////////////////////////////////////////////////////////////// |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1074 // INITIALIZER HELPERS |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1075 ////////////////////////////////////////////////////////////////////////////////////////*/ |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1076 |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1077 LLConstant* DtoConstInitializer(Loc loc, Type* type, Initializer* init) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1078 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1079 LLConstant* _init = 0; // may return zero |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1080 if (!init) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1081 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1082 Logger::println("const default initializer for %s", type->toChars()); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1083 _init = DtoConstExpInit(loc, type, type->defaultInit()); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1084 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1085 else if (ExpInitializer* ex = init->isExpInitializer()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1086 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1087 Logger::println("const expression initializer"); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1088 _init = DtoConstExpInit(loc, type, ex->exp);; |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1089 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1090 else if (StructInitializer* si = init->isStructInitializer()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1091 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1092 Logger::println("const struct initializer"); |
1228
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1207
diff
changeset
|
1093 si->ad->codegen(Type::sir); |
79758fd2f48a
Added Doxygen file.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1207
diff
changeset
|
1094 return si->ad->ir.irStruct->createStructInitializer(si); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1095 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1096 else if (ArrayInitializer* ai = init->isArrayInitializer()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1097 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1098 Logger::println("const array initializer"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1099 _init = DtoConstArrayInitializer(ai); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1100 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1101 else if (init->isVoidInitializer()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1102 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1103 Logger::println("const void initializer"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1104 const LLType* ty = DtoType(type); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1105 _init = llvm::Constant::getNullValue(ty); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1106 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1107 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1108 Logger::println("unsupported const initializer: %s", init->toChars()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1109 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1110 return _init; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1111 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1112 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1113 ////////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1114 |
482
aa8c050dfd19
Move zero init of padding to DtoInitializer in order to respect void initializers.
Christian Kamm <kamm incasoftware de>
parents:
481
diff
changeset
|
1115 DValue* DtoInitializer(LLValue* target, Initializer* init) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1116 { |
328
7086a84ab3d6
[svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents:
315
diff
changeset
|
1117 if (!init) |
7086a84ab3d6
[svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents:
315
diff
changeset
|
1118 return 0; |
7086a84ab3d6
[svn r349] Fixed problems with static arrays of void as well as a static arrays with zero length.
lindquist
parents:
315
diff
changeset
|
1119 else if (ExpInitializer* ex = init->isExpInitializer()) |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1120 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1121 Logger::println("expression initializer"); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1122 assert(ex->exp); |
1004
45ed9e125a00
Remove initialization of padding of reals, ireals and creals.
Frits van Bommel <fvbommel wxs.nl>
parents:
994
diff
changeset
|
1123 return ex->exp->toElem(gIR); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1124 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1125 else if (init->isVoidInitializer()) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1126 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1127 // do nothing |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1128 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1129 else { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1130 Logger::println("unsupported initializer: %s", init->toChars()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1131 assert(0); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1132 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1133 return 0; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1134 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1135 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1136 ////////////////////////////////////////////////////////////////////////////////////////// |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1137 |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1138 static LLConstant* expand_to_sarray(Type *base, Expression* exp) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1139 { |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1140 Logger::println("building type %s from expression (%s) of type %s", base->toChars(), exp->toChars(), exp->type->toChars()); |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1141 const LLType* dstTy = DtoType(base); |
622
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
1142 if (Logger::enabled()) |
26fce59fe80a
Wrapped all the most potentially expensive logging calls in a conditional to only do work when actually requested.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
611
diff
changeset
|
1143 Logger::cout() << "final llvm type requested: " << *dstTy << '\n'; |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1144 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1145 LLConstant* val = exp->toConstElem(gIR); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1146 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1147 Type* expbase = exp->type->toBasetype(); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1148 Logger::println("expbase: %s", expbase->toChars()); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1149 Type* t = base->toBasetype(); |
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1150 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1151 LLSmallVector<size_t, 4> dims; |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1152 |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1153 while(1) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1154 { |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1155 Logger::println("t: %s", t->toChars()); |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1156 if (t->equals(expbase)) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1157 break; |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1158 assert(t->ty == Tsarray); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1159 TypeSArray* tsa = (TypeSArray*)t; |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1160 dims.push_back(tsa->dim->toInteger()); |
758
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1161 assert(t->nextOf()); |
f04dde6e882c
Added initial D2 support, D2 frontend and changes to codegen to make things compile.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
757
diff
changeset
|
1162 t = t->nextOf()->toBasetype(); |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1163 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1164 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1165 size_t i = dims.size(); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1166 assert(i); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1167 |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1168 std::vector<LLConstant*> inits; |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1169 while (i--) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1170 { |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1171 const LLArrayType* arrty = LLArrayType::get(val->getType(), dims[i]); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1172 inits.clear(); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1173 inits.insert(inits.end(), dims[i], val); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1174 val = LLConstantArray::get(arrty, inits); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1175 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1176 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1177 return val; |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1178 } |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1179 |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1180 LLConstant* DtoConstExpInit(Loc loc, Type* type, Expression* exp) |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1181 { |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1182 Type* expbase = exp->type->toBasetype(); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1183 Type* base = type->toBasetype(); |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1184 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1185 // if not the same basetypes, we won't get the same llvm types either |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1186 if (!expbase->equals(base)) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1187 { |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1188 if (base->ty == Tsarray) |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1189 { |
796
6e7a4c3b64d2
Error instead of assert when trying to build a default initializer for void[n].
Christian Kamm <kamm incasoftware de>
parents:
794
diff
changeset
|
1190 if (base->nextOf()->toBasetype()->ty == Tvoid) { |
6e7a4c3b64d2
Error instead of assert when trying to build a default initializer for void[n].
Christian Kamm <kamm incasoftware de>
parents:
794
diff
changeset
|
1191 error(loc, "static arrays of voids have no default initializer"); |
6e7a4c3b64d2
Error instead of assert when trying to build a default initializer for void[n].
Christian Kamm <kamm incasoftware de>
parents:
794
diff
changeset
|
1192 fatal(); |
6e7a4c3b64d2
Error instead of assert when trying to build a default initializer for void[n].
Christian Kamm <kamm incasoftware de>
parents:
794
diff
changeset
|
1193 } |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
1194 Logger::println("type is a static array, building constant array initializer to single value"); |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1195 return expand_to_sarray(base, exp); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1196 } |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1197 else |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1198 { |
715
30b42a283c8e
Removed TypeOpaque from DMD.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
709
diff
changeset
|
1199 error("cannot yet convert default initializer %s to type %s to %s", exp->toChars(), exp->type->toChars(), type->toChars()); |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1200 fatal(); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1201 } |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1202 assert(0); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1203 } |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1204 |
502
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1205 return exp->toConstElem(gIR); |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1206 } |
837af2a63564
Fixed problems constant multidimensional static array initializers.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
486
diff
changeset
|
1207 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1208 ////////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1209 |
1255
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1210 static LLValue* expand_value_to_sarray(Type *base, Expression* exp) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1211 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1212 Logger::println("building type %s from expression (%s) of type %s", base->toChars(), exp->toChars(), exp->type->toChars()); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1213 const LLType* dstTy = DtoType(base); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1214 if (Logger::enabled()) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1215 Logger::cout() << "final llvm type requested: " << *dstTy << '\n'; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1216 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1217 // get initial value |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1218 LLValue* val = exp->toElem(gIR)->getRVal(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1219 if (DtoIsPassedByRef(exp->type)) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1220 val = DtoLoad(val); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1221 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1222 Type* expbase = exp->type->toBasetype(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1223 Logger::println("expbase: %s", expbase->toChars()); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1224 Type* t = base->toBasetype(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1225 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1226 LLSmallVector<size_t, 4> dims; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1227 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1228 while(1) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1229 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1230 Logger::println("t: %s", t->toChars()); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1231 if (t->equals(expbase)) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1232 break; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1233 assert(t->ty == Tsarray); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1234 TypeSArray* tsa = (TypeSArray*)t; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1235 dims.push_back(tsa->dim->toInteger()); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1236 assert(t->nextOf()); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1237 t = t->nextOf()->toBasetype(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1238 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1239 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1240 size_t i = dims.size(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1241 assert(i); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1242 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1243 std::vector<LLValue*> inits; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1244 while (i--) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1245 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1246 // start with undefined array |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1247 const LLArrayType* arrty = LLArrayType::get(val->getType(), dims[i]); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1248 LLValue* tmp = llvm::UndefValue::get(arrty); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1249 for (size_t j = 0; j < dims[i]; j++) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1250 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1251 tmp = gIR->ir->CreateInsertValue(tmp, val, j); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1252 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1253 val = tmp; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1254 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1255 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1256 return val; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1257 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1258 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1259 LLValue* DtoExprValue(Type* type, Expression* e) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1260 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1261 Type* t1 = e->type->toBasetype(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1262 Type* t2 = type->toBasetype(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1263 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1264 // expand static arrays |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1265 if (t2->ty == Tsarray && !t1->equals(t2)) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1266 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1267 return expand_value_to_sarray(t2, e); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1268 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1269 // or not |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1270 else |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1271 { |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1272 DValue* dv = e->toElem(gIR); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1273 LLValue* v = dv->getRVal(); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1274 if (DtoIsPassedByRef(e->type)) |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1275 v = DtoLoad(v); |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1276 return v; |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1277 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1278 } |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1279 |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1280 ////////////////////////////////////////////////////////////////////////////////////////// |
9014d7f0433f
Rewrote runtime struct literal codegen.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1228
diff
changeset
|
1281 |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1282 void DtoAnnotation(const char* str) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1283 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1284 std::string s("CODE: "); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1285 s.append(str); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1286 char* p = &s[0]; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1287 while (*p) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1288 { |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1289 if (*p == '"') |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1290 *p = '\''; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1291 ++p; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1292 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1293 // create a noop with the code as the result name! |
797
340acf1535d0
Removed KDevelop3 project files, CMake can generate them just fine!
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
796
diff
changeset
|
1294 // FIXME: this is const folded and eliminated immediately ... :/ |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1295 gIR->ir->CreateAnd(DtoConstSize_t(0),DtoConstSize_t(0),s.c_str()); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1296 } |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1297 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1298 ////////////////////////////////////////////////////////////////////////////////////////// |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1299 |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1300 LLConstant* DtoTypeInfoOf(Type* type, bool base) |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1301 { |
290
ebaf65fc4726
[svn r311] Fixed: structs no longer output two static typeinfos.
lindquist
parents:
289
diff
changeset
|
1302 type = type->merge(); // needed.. getTypeInfo does the same |
ebaf65fc4726
[svn r311] Fixed: structs no longer output two static typeinfos.
lindquist
parents:
289
diff
changeset
|
1303 type->getTypeInfo(NULL); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1304 TypeInfoDeclaration* tidecl = type->vtinfo; |
290
ebaf65fc4726
[svn r311] Fixed: structs no longer output two static typeinfos.
lindquist
parents:
289
diff
changeset
|
1305 assert(tidecl); |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
1306 tidecl->codegen(Type::sir); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1307 assert(tidecl->ir.irGlobal != NULL); |
1148
3d1b16dabd25
Eliminated the need for resolve, declare, const-init and define lists to drive code generation.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents:
1147
diff
changeset
|
1308 assert(tidecl->ir.irGlobal->value != NULL); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1309 LLConstant* c = isaConstant(tidecl->ir.irGlobal->value); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1310 assert(c != NULL); |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1311 if (base) |
290
ebaf65fc4726
[svn r311] Fixed: structs no longer output two static typeinfos.
lindquist
parents:
289
diff
changeset
|
1312 return llvm::ConstantExpr::getBitCast(c, DtoType(Type::typeinfo->type)); |
244
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1313 return c; |
a95056b3c996
[svn r261] Fixed debug info for integer and floating local variables, can now be inspected in GDB.
lindquist
parents:
diff
changeset
|
1314 } |
284
70c370e97944
[svn r305] Started support for custom class allocators/deallocators. Allocators with more than one argument still need to be fixed.
lindquist
parents:
250
diff
changeset
|
1315 |
289
17d3b3236334
[svn r310] Fixed a problem with incomplete types and templates in typeinfo code.
lindquist
parents:
284
diff
changeset
|
1316 ////////////////////////////////////////////////////////////////////////////////////////// |
17d3b3236334
[svn r310] Fixed a problem with incomplete types and templates in typeinfo code.
lindquist
parents:
284
diff
changeset
|
1317 |
527
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1318 void DtoOverloadedIntrinsicName(TemplateInstance* ti, TemplateDeclaration* td, std::string& name) |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1319 { |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1320 Logger::println("DtoOverloadedIntrinsicName"); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1321 LOG_SCOPE; |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1322 |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1323 Logger::println("template instance: %s", ti->toChars()); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1324 Logger::println("template declaration: %s", td->toChars()); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1325 Logger::println("intrinsic name: %s", td->intrinsicName.c_str()); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1326 |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1327 // for now use the size in bits of the first template param in the instance |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1328 assert(ti->tdtypes.dim == 1); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1329 Type* T = (Type*)ti->tdtypes.data[0]; |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1330 |
1079 | 1331 char prefix = T->isreal() ? 'f' : T->isintegral() ? 'i' : 0; |
1332 if (!prefix) { | |
1333 ti->error("has invalid template parameter for intrinsic: %s", T->toChars()); | |
1334 fatal(); // or LLVM asserts | |
1335 } | |
1336 | |
1337 char tmp[21]; // probably excessive, but covers a uint64_t | |
1167
ed4b050ada45
Another big-endian fix. (Don't lie to [s]printf...)
Frits van Bommel <fvbommel wxs.nl>
parents:
1160
diff
changeset
|
1338 sprintf(tmp, "%lu", (unsigned long) gTargetData->getTypeSizeInBits(DtoType(T))); |
527
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1339 |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1340 // replace # in name with bitsize |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1341 name = td->intrinsicName; |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1342 |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1343 std::string needle("#"); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1344 size_t pos; |
1079 | 1345 while(std::string::npos != (pos = name.find(needle))) { |
1346 if (pos > 0 && name[pos-1] == prefix) { | |
1347 // Properly prefixed, insert bitwidth. | |
1348 name.replace(pos, 1, tmp); | |
1349 } else { | |
1350 if (pos && (name[pos-1] == 'i' || name[pos-1] == 'f')) { | |
1351 // Wrong type character. | |
1352 ti->error("has invalid parameter type for intrinsic %s: %s is not a%s type", | |
1353 name.c_str(), T->toChars(), | |
1354 (name[pos-1] == 'i' ? "n integral" : " floating-point")); | |
1355 } else { | |
1088
a08983bf972e
Move "invalid intrinsic name" error to declaration, not instantiation.
Frits van Bommel <fvbommel wxs.nl>
parents:
1079
diff
changeset
|
1356 // Just plain wrong. (Error in declaration, not instantiation) |
a08983bf972e
Move "invalid intrinsic name" error to declaration, not instantiation.
Frits van Bommel <fvbommel wxs.nl>
parents:
1079
diff
changeset
|
1357 td->error("has an invalid intrinsic name: %s", name.c_str()); |
1079 | 1358 } |
1359 fatal(); // or LLVM asserts | |
1360 } | |
1361 } | |
527
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1362 |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1363 Logger::println("final intrinsic name: %s", name.c_str()); |
cecfee2d01a8
Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
505
diff
changeset
|
1364 } |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1365 |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1366 ////////////////////////////////////////////////////////////////////////////////////////// |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1367 |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1368 bool mustDefineSymbol(Dsymbol* s) |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1369 { |
1279
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1370 if (FuncDeclaration* fd = s->isFuncDeclaration()) |
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1371 { |
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1372 if (fd->isArrayOp) |
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1373 return true; |
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1374 } |
04c36605feb9
Fixed array operation codegen when used from imported templates. All array operations are now emitted with template linkage. Fixed #270 .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1278
diff
changeset
|
1375 |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1376 TemplateInstance* tinst = DtoIsTemplateInstance(s); |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1377 if (tinst) |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1378 { |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1379 if (!opts::singleObj) |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1380 return true; |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1381 |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1382 if (!tinst->emittedInModule) |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1383 tinst->emittedInModule = gIR->dmodule; |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1384 return tinst->emittedInModule == gIR->dmodule; |
947
9a10fa839dc5
Switch some getModule to getCompilationModule to make sure templates are
Christian Kamm <kamm incasoftware de>
parents:
946
diff
changeset
|
1385 } |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1386 |
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1387 return s->getModule() == gIR->dmodule; |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1388 } |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1389 |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1390 ////////////////////////////////////////////////////////////////////////////////////////// |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1391 |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1392 bool needsTemplateLinkage(Dsymbol* s) |
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1393 { |
1067
7ce8355fbcc6
Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents:
1044
diff
changeset
|
1394 return DtoIsTemplateInstance(s) && mustDefineSymbol(s); |
940
39519a1ff603
Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
936
diff
changeset
|
1395 } |
1029
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1396 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1397 ////////////////////////////////////////////////////////////////////////////////////////// |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1398 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1399 bool hasUnalignedFields(Type* t) |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1400 { |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1401 t = t->toBasetype(); |
1044
39f12f5aa515
Fix hasUnalignedFields(): take static arrays into account too.
Frits van Bommel <fvbommel wxs.nl>
parents:
1029
diff
changeset
|
1402 if (t->ty == Tsarray) { |
39f12f5aa515
Fix hasUnalignedFields(): take static arrays into account too.
Frits van Bommel <fvbommel wxs.nl>
parents:
1029
diff
changeset
|
1403 assert(t->next->size() % t->next->alignsize() == 0); |
39f12f5aa515
Fix hasUnalignedFields(): take static arrays into account too.
Frits van Bommel <fvbommel wxs.nl>
parents:
1029
diff
changeset
|
1404 return hasUnalignedFields(t->next); |
39f12f5aa515
Fix hasUnalignedFields(): take static arrays into account too.
Frits van Bommel <fvbommel wxs.nl>
parents:
1029
diff
changeset
|
1405 } else if (t->ty != Tstruct) |
1029
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1406 return false; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1407 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1408 TypeStruct* ts = (TypeStruct*)t; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1409 if (ts->unaligned) |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1410 return (ts->unaligned == 2); |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1411 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1412 StructDeclaration* sym = ts->sym; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1413 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1414 // go through all the fields and try to find something unaligned |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1415 ts->unaligned = 2; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1416 for (int i = 0; i < sym->fields.dim; i++) |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1417 { |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1418 VarDeclaration* f = (VarDeclaration*)sym->fields.data[i]; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1419 unsigned a = f->type->alignsize() - 1; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1420 if (((f->offset + a) & ~a) != f->offset) |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1421 return true; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1422 else if (f->type->toBasetype()->ty == Tstruct && hasUnalignedFields(f->type)) |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1423 return true; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1424 } |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1425 |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1426 ts->unaligned = 1; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1427 return false; |
4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents:
1019
diff
changeset
|
1428 } |
1271
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1429 |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1430 ////////////////////////////////////////////////////////////////////////////////////////// |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1431 |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1432 IrModule * getIrModule(Module * M) |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1433 { |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1434 if (M == NULL) |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1435 M = gIR->func()->decl->getModule(); |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1436 assert(M && "null module"); |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1437 if (!M->ir.irModule) |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1438 M->ir.irModule = new IrModule(M, M->srcfile->toChars()); |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1439 return M->ir.irModule; |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1440 } |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1441 |
0686701178d3
Moved special casing of 'assert(this, "null this");' generated statements from !ThisExp into !AssertExp.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1255
diff
changeset
|
1442 ////////////////////////////////////////////////////////////////////////////////////////// |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1443 |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1444 size_t realignOffset(size_t offset, Type* type) |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1445 { |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1446 size_t alignsize = type->alignsize(); |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1447 size_t alignedoffset = (offset + alignsize - 1) & ~(alignsize - 1); |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1448 |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1449 // if the aligned offset already matches the input offset |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1450 // don't waste time checking things are ok! |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1451 if (alignedoffset == offset) |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1452 return alignedoffset; |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1453 |
1356
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1454 // we cannot get the llvm alignment if the type is still opaque, this can happen in some |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1455 // forward reference situations, so when this happens we fall back to manual padding. |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1456 const llvm::Type* T = DtoType(type); |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1457 if (llvm::isa<llvm::OpaqueType>(T)) |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1458 { |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1459 return offset; |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1460 } |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1461 |
1356
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1462 // then we check against the llvm alignment |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1463 size_t alignsize2 = gTargetData->getABITypeAlignment(T); |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1464 |
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1465 // if it differs we need to insert manual padding as well |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1466 if (alignsize != alignsize2) |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1467 { |
1355
c5410f294c89
Erm... Revert the rev [1352] change, the original code was correct ...
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1352
diff
changeset
|
1468 assert(alignsize > alignsize2 && "this is not good, the D and LLVM " |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1469 "type alignments differ, but LLVM's is bigger! This will break " |
1356
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1470 "aggregate type mapping"); |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1471 // don't try and align the offset, and let the mappers pad 100% manually |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1472 return offset; |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1473 } |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1474 |
1356
59c2aa9def23
Enabled fix for ticket #294 . It will try it's best to let LLVM handle the alignment, and fall back to manual padding when that's not possible. If this causes problems again, we'll have to consistently pad manually using packed structs.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1355
diff
changeset
|
1475 // ok, we're good, llvm will align properly! |
1351
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1476 return alignedoffset; |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1477 } |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1478 |
8d501abecd24
Initial (but disabled) fix for ticket #294 , the actual part that fixes the bug is in a #if 0 block as I'm afraid it will cause regressions. I'm most likely not going to be around tonight, and maybe not tomorrow as well, so I'm pushing it in case someone wants to run some serious testing/investigate the problem noted in llvmhelpers.cpp : realignOffset .
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1350
diff
changeset
|
1479 ////////////////////////////////////////////////////////////////////////////////////////// |