digitalmars.D.announce - ldc 0.9.1 released
- Christian Kamm (21/21) May 27 2009 The release 0.9.1 of LDC, the LLVM based compiler for the D programming
- Andrei Alexandrescu (6/32) May 27 2009 Great! Quick question - are you supporting or considering supporting D2?...
- Robert Clipsham (7/14) May 27 2009 D2 support in LDC has been started, but it does not have any of D2's
- Frits van Bommel (6/22) May 27 2009 That's pretty accurate, actually.
- Robert Clipsham (9/34) May 27 2009 I actually thought about giving this a try about a week ago. I managed
- Lutger (3/11) May 27 2009 I'm interested, for sure.
- Kagamin (2/8) May 28 2009 I found recently that properly designed C++ code can live happily withou...
- Walter Bright (4/9) May 28 2009 The D compiler source doesn't use any templates, rtti, or clever macro
- Robert Fraser (10/13) May 28 2009 I ported part of the DMDFE to Java, and found it quite well-designed
- bearophile (5/8) May 28 2009 This current characteristics of D classes makes them a bit simpler to re...
- Nick Sabalausky (5/13) May 28 2009 Yea, I haven't seen anything yet about lifting the one-to-one module-to-...
- Nick Sabalausky (6/15) May 28 2009 As someone who's (deliberately) barely touched C++ in about ten years, I...
- Sean Kelly (2/4) May 29 2009 The problem is trying to get an entire team to code that way.
- Tomas Lindquist Olsen (29/53) May 27 2009 The way the frontend is developed is also a factor.
- Danny Wilson (7/9) May 29 2009 You could setup a seperate branch with the DMD source, extract source
- Robert Clipsham (3/29) May 27 2009 Congratulations on your hard work! This is a really big step for LDC and...
- Jarrett Billingsley (4/21) May 27 2009 r
- Leandro Lucarella (7/23) May 27 2009 Great, great news! Thanks for the hard work.
- bearophile (6/10) May 27 2009 Phobos1 of DMD too has alloca, so can this optimization be folded in DMD...
- Robert Clipsham (17/21) May 27 2009 Looking at the source code (gen/passes/*.cpp):
- Leandro Lucarella (14/27) May 27 2009 I don't think so, they are D specific LLVM optimization passes, see:
- Frits van Bommel (31/44) May 27 2009 These optimizations are done on LLVM IR, so unless DMD switches to LLVM ...
- bearophile (26/35) May 27 2009 I'm trying to find situations where that's true, but in two small progra...
- Frits van Bommel (38/79) May 27 2009 No, those are GC allocations.
- bearophile (5/8) May 27 2009 I understand, and that may be more complex to do if the code is multi-th...
- Timo Gransch (12/12) May 27 2009 First of all: Thanks for your your great work.
- Christian Kamm (4/13) May 28 2009 On x86-32 that gives me a listing of the main function defined in the D
- Timo Gransch (39/43) May 28 2009 On Arch Linux/32 (using the official ldc binary), list prints the source
- Christian Kamm (6/14) May 29 2009 Since there's main and _Dmain and I don't know how the GDB patches inter...
- Timo Gransch (4/6) May 30 2009 I appended my answer to the existing thread 'Debugging LDC executables'.
- bearophile (16/16) May 27 2009 While this code:
- Frits van Bommel (8/24) May 27 2009 For arrays that escape, it's quite probably more efficient since it only...
- Lutger (1/1) May 27 2009 Great news, happy to see x86_64 on the feature list :)
The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements: * lots of bug fixes (http://www.dsource.org/projects/ldc/report/15) * x86-64 support is mature * inline asm improved (we now define D_Inline_Asm) * cross-compilation support * uses boehm-gc during compilation (x86-32 only) * D specific optimizations: * turn GC allocations to allocas if possible * simplify or remove certain calls to D runtime functions The command line interface of LDC now has added options in line with other LLVM based tools. Please use the ldmd wrapper if you want a drop-in replacement for DMD. Linux x86-32 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_32.tar.bz2 Linux x86-64 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_64.tar.bz2 Tomas Lindquist Olsen Christian Kamm Frits van Bommel Kelly Wilson
May 27 2009
Christian Kamm wrote:The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements: * lots of bug fixes (http://www.dsource.org/projects/ldc/report/15) * x86-64 support is mature * inline asm improved (we now define D_Inline_Asm) * cross-compilation support * uses boehm-gc during compilation (x86-32 only) * D specific optimizations: * turn GC allocations to allocas if possible * simplify or remove certain calls to D runtime functions The command line interface of LDC now has added options in line with other LLVM based tools. Please use the ldmd wrapper if you want a drop-in replacement for DMD. Linux x86-32 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_32.tar.bz2 Linux x86-64 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_64.tar.bz2 Tomas Lindquist Olsen Christian Kamm Frits van Bommel Kelly WilsonGreat! Quick question - are you supporting or considering supporting D2? I looked on the project's home page and couldn't find that information. There's mention of druntime for D2 which makes me hopeful. Thanks, Andrei
May 27 2009
Andrei Alexandrescu wrote:Great! Quick question - are you supporting or considering supporting D2? I looked on the project's home page and couldn't find that information. There's mention of druntime for D2 which makes me hopeful. Thanks, AndreiD2 support in LDC has been started, but it does not have any of D2's features implemented. I believe all that has been done is the frontend added. Last time I checked ldc + d2 would not compile. I believe that the plan is to make D1 solid (more so than DMD), before moving on to D2. One of the developers might be able to give a more accurate status.
May 27 2009
Robert Clipsham wrote:Andrei Alexandrescu wrote:That's pretty accurate, actually. A while back somebody sent in a patch to get D2 support working, but by the time it got properly reviewed it was already outdated... The main problem on this front is that nobody currently working on LDC is particularly interested in D2.Great! Quick question - are you supporting or considering supporting D2? I looked on the project's home page and couldn't find that information. There's mention of druntime for D2 which makes me hopeful. Thanks, AndreiD2 support in LDC has been started, but it does not have any of D2's features implemented. I believe all that has been done is the frontend added. Last time I checked ldc + d2 would not compile. I believe that the plan is to make D1 solid (more so than DMD), before moving on to D2. One of the developers might be able to give a more accurate status.
May 27 2009
Frits van Bommel wrote:Robert Clipsham wrote:I actually thought about giving this a try about a week ago. I managed to get all but one file to compile with the current version of the D2 front end (2.021 I believe)... Not bad considering my (lack of) C/C++ knowledge. If there's some interest for it I suppose I could give it another shot and try to merge the latest front end, it'd be a good chance for me to finally learn C/C++ (I made the <del>mistake</del> decision to learn D first... I found it too awesome to bother learning the obviously inferior C/C++ :P).Andrei Alexandrescu wrote:That's pretty accurate, actually. A while back somebody sent in a patch to get D2 support working, but by the time it got properly reviewed it was already outdated... The main problem on this front is that nobody currently working on LDC is particularly interested in D2.Great! Quick question - are you supporting or considering supporting D2? I looked on the project's home page and couldn't find that information. There's mention of druntime for D2 which makes me hopeful. Thanks, AndreiD2 support in LDC has been started, but it does not have any of D2's features implemented. I believe all that has been done is the frontend added. Last time I checked ldc + d2 would not compile. I believe that the plan is to make D1 solid (more so than DMD), before moving on to D2. One of the developers might be able to give a more accurate status.
May 27 2009
Robert Clipsham wrote: ...I actually thought about giving this a try about a week ago. I managed to get all but one file to compile with the current version of the D2 front end (2.021 I believe)... Not bad considering my (lack of) C/C++ knowledge. If there's some interest for it I suppose I could give it another shot and try to merge the latest front end, it'd be a good chance for me to finally learn C/C++ (I made the <del>mistake</del> decision to learn D first... I found it too awesome to bother learning the obviously inferior C/C++ :P).I'm interested, for sure.
May 27 2009
Robert Clipsham Wrote:Not bad considering my (lack of) C/C++ knowledge. If there's some interest for it I suppose I could give it another shot and try to merge the latest front end, it'd be a good chance for me to finally learn C/C++ (I made the <del>mistake</del> decision to learn D first... I found it too awesome to bother learning the obviously inferior C/C++ :P).I found recently that properly designed C++ code can live happily without all that esoteric macro/template crap and can be pretty readable and understandable even using nasty antipatterns. This being achieved simply by using C++ subset that is supported on various platforms. Code that does the job instead of casting black magic.
May 28 2009
Kagamin wrote:I found recently that properly designed C++ code can live happily without all that esoteric macro/template crap and can be pretty readable and understandable even using nasty antipatterns. This being achieved simply by using C++ subset that is supported on various platforms. Code that does the job instead of casting black magic.The D compiler source doesn't use any templates, rtti, or clever macro hacks. Whether it's well designed or not, I'll let others decide. It is written in a "D-ish" style.
May 28 2009
Walter Bright wrote:The D compiler source doesn't use any templates, rtti, or clever macro hacks. Whether it's well designed or not, I'll let others decide. It is written in a "D-ish" style.I ported part of the DMDFE to Java, and found it quite well-designed (with the exception of the frequent use of globals). The gotos make it more readable IMO (compare the original to the Java version where gotos are replaced with exceptions, replaced with duplicated code, emulated with a bunch of booleans, or refactored into separate functions taking 7+ arguments). However, the DMDFE's organization relies on being able to declare class member functions separately from where they're defined, which is impossible in D (hint, hint, nudge, nudge).
May 28 2009
Robert Fraser:However, the DMDFE's organization relies on being able to declare class member functions separately from where they're defined, which is impossible in D (hint, hint, nudge, nudge).This current characteristics of D classes makes them a bit simpler to read/understand/use. Can you tell me (and/or show a small example) where you think such separation may improve some D code? Bye, bearophile
May 28 2009
"bearophile" <bearophileHUGS lycos.com> wrote in message news:gvmtt5$5os$1 digitalmars.com...Robert Fraser:Yea, I haven't seen anything yet about lifting the one-to-one module-to-file mapping that would make breaking bud/rebuild-like tools worthwhile. But I'd be interested in hearing any arguments in favor of doing so.However, the DMDFE's organization relies on being able to declare class member functions separately from where they're defined, which is impossible in D (hint, hint, nudge, nudge).This current characteristics of D classes makes them a bit simpler to read/understand/use. Can you tell me (and/or show a small example) where you think such separation may improve some D code?
May 28 2009
"Walter Bright" <newshound1 digitalmars.com> wrote in message news:gvml4m$2lg0$2 digitalmars.com...Kagamin wrote:As someone who's (deliberately) barely touched C++ in about ten years, I found it surprisingly easy to find my way around. Although I did find it strange that there seemed to be a fair amount of duplicated code (at least WRT to error/warning reporting anyway).I found recently that properly designed C++ code can live happily without all that esoteric macro/template crap and can be pretty readable and understandable even using nasty antipatterns. This being achieved simply by using C++ subset that is supported on various platforms. Code that does the job instead of casting black magic.The D compiler source doesn't use any templates, rtti, or clever macro hacks. Whether it's well designed or not, I'll let others decide. It is written in a "D-ish" style.
May 28 2009
Kagamin wrote:I found recently that properly designed C++ code can live happily without all that esoteric macro/template crap and can be pretty readable and understandable even using nasty antipatterns. This being achieved simply by using C++ subset that is supported on various platforms. Code that does the job instead of casting black magic.The problem is trying to get an entire team to code that way.
May 29 2009
On Wed, May 27, 2009 at 9:32 PM, Frits van Bommel <fvbommel remwovexcapss.nl> wrote:Robert Clipsham wrote:The way the frontend is developed is also a factor. Right now we have two frontend source dirs. One for D1 and one for D2. Every time a new DMD release is out, this means: cleaning out the files we don't need (or can't use) in LDC, merging the changes into LDC, repeating for D2. But merging isn't always trivial. Since we have quite a lot of changes and conflicts are common. Also often LDC bugreports are frontend related, and both D1 and D2 need identical fixes applied, this is often forgotten. So, for now we're focusing on D1 and unfortunately D2 has fallen behind to a point where it's just plain broken. I would like to see more improvements to the way the DMD frontend is developed - regarding other users than the DMD compiler - before picking up D2 again. More specifically: * Seperation of frontend and backend needs to be more clear. The file structure is one thing, but it would be nice if the DMD backend specific parts in the frontend code could be versioned out for DMD. A simple ` #if IN_DMD ' would be a big improvement. * put the code under version control, that could simplify pulling fixes into our tree. I was going to put a few more entries on this list, but I could probably provide some patches there instead of just asking for things to happen .. But the main point is, D1 support is more than enough work already, however these two simple improvements would be a big help, and will benefit others who wish to use the frontend in the future as well. -TomasAndrei Alexandrescu wrote:That's pretty accurate, actually. A while back somebody sent in a patch to get D2 support working, but by the time it got properly reviewed it was already outdated... The main problem on this front is that nobody currently working on LDC is particularly interested in D2.Great! Quick question - are you supporting or considering supporting D2? I looked on the project's home page and couldn't find that information. There's mention of druntime for D2 which makes me hopeful. Thanks, AndreiD2 support in LDC has been started, but it does not have any of D2's features implemented. I believe all that has been done is the frontend added. Last time I checked ldc + d2 would not compile. I believe that the plan is to make D1 solid (more so than DMD), before moving on to D2. One of the developers might be able to give a more accurate status.
May 27 2009
Op Thu, 28 May 2009 03:08:45 +0200 schreef Tomas Lindquist Olsen <tomas.l.olsen gmail.com>:* put the code under version control, that could simplify pulling fixes into our tree.You could setup a seperate branch with the DMD source, extract source tarball, commit. Then merge the DMDFE branch into the LDC branches. I dont know how to do this in hg, but i guess its very similar to git. Or is it already done this way?
May 29 2009
Christian Kamm wrote:The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements: * lots of bug fixes (http://www.dsource.org/projects/ldc/report/15) * x86-64 support is mature * inline asm improved (we now define D_Inline_Asm) * cross-compilation support * uses boehm-gc during compilation (x86-32 only) * D specific optimizations: * turn GC allocations to allocas if possible * simplify or remove certain calls to D runtime functions The command line interface of LDC now has added options in line with other LLVM based tools. Please use the ldmd wrapper if you want a drop-in replacement for DMD. Linux x86-32 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_32.tar.bz2 Linux x86-64 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_64.tar.bz2 Tomas Lindquist Olsen Christian Kamm Frits van Bommel Kelly WilsonCongratulations on your hard work! This is a really big step for LDC and D, so thanks!
May 27 2009
On Wed, May 27, 2009 at 2:19 PM, Christian Kamm <kamm-incasoftware removethis.de> wrote:The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements: =A0* lots of bug fixes (http://www.dsource.org/projects/ldc/report/15) =A0* x86-64 support is mature =A0* inline asm improved (we now define D_Inline_Asm) =A0* cross-compilation support =A0* uses boehm-gc during compilation (x86-32 only) =A0* D specific optimizations: =A0 * turn GC allocations to allocas if possible =A0 * simplify or remove certain calls to D runtime functions The command line interface of LDC now has added options in line with othe=rLLVM based tools. Please use the ldmd wrapper if you want a drop-in replacement for DMD. Linux x86-32 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_32.tar.bz2 Linux x86-64 download: http://www.incasoftware.de/~kamm/ldc/ldc-0.9.1-x86_64.tar.bz2Rock on!
May 27 2009
Christian Kamm, el 27 de mayo a las 20:19 me escribiste:The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements: * lots of bug fixes (http://www.dsource.org/projects/ldc/report/15) * x86-64 support is mature * inline asm improved (we now define D_Inline_Asm) * cross-compilation support * uses boehm-gc during compilation (x86-32 only) * D specific optimizations: * turn GC allocations to allocas if possible * simplify or remove certain calls to D runtime functions The command line interface of LDC now has added options in line with other LLVM based tools. Please use the ldmd wrapper if you want a drop-in replacement for DMD.Great, great news! Thanks for the hard work. -- Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/ ---------------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ----------------------------------------------------------------------------
May 27 2009
Christian Kamm:The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements:Very good. I'll try this too.* turn GC allocations to allocas if possiblePhobos1 of DMD too has alloca, so can this optimization be folded in DMD too?* simplify or remove certain calls to D runtime functionsWhat calls? Bye, bearophile
May 27 2009
bearophile wrote:I doubt it, these look like LLVM specific optimisations.* turn GC allocations to allocas if possiblePhobos1 of DMD too has alloca, so can this optimization be folded in DMD too?Looking at the source code (gen/passes/*.cpp): * _d_arraysetlengthT * _d_arraysetlengthiT * _d_array_cast_len * _d_array_slice_copy * _d_allocmemoryT * _d_newarrayT * _d_newarrayiT * _d_newarrayvT * _d_newarraymT * _d_newarraymiT * _d_newarraymvT * _d_allocclass Are the runtime calls currently optimized. There may be more that I've missed, that looks like all of them though.* simplify or remove certain calls to D runtime functionsWhat calls?
May 27 2009
bearophile, el 27 de mayo a las 15:55 me escribiste:Christian Kamm:I don't think so, they are D specific LLVM optimization passes, see: http://www.dsource.org/projects/ldc/browser/gen/passesThe release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements:Very good. I'll try this too.* turn GC allocations to allocas if possiblePhobos1 of DMD too has alloca, so can this optimization be folded in DMD too?From what I saw in: http://www.dsource.org/projects/ldc/browser/gen/passes/SimplifyDRuntimeCalls.cpp - Remove libcall for arr.length = N if N <= arr.length - Remove libcall for cast(T[]) arr if it's safe to do so. - Remove libcall if the return value is unused. - Turn slice copies into llvm.memcpy when safe -- Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/ ---------------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ----------------------------------------------------------------------------* simplify or remove certain calls to D runtime functionsWhat calls?
May 27 2009
bearophile wrote:Christian Kamm:These optimizations are done on LLVM IR, so unless DMD switches to LLVM they'll need to be completely reimplemented for DMD. This one is only done for certain GC allocations by the way, not all of them. The ones currently implemented are: * new Struct/int/float/etc., * uninitialized arrays (used for arr1 ~ arr2, for instance), * zero-initialized arrays (e.g. new int[N]) * new Class, unless a) it has a destructor, b) it has a custom allocator (overloads new), or c) it has a custom deallocator (overloads delete).The release 0.9.1 of LDC, the LLVM based compiler for the D programming language, contains the following major improvements:Very good. I'll try this too.* turn GC allocations to allocas if possiblePhobos1 of DMD too has alloca, so can this optimization be folded in DMD too?Besides the GC calls turned into allocas, these are currently implemented: * For "arr.length = N", the runtime call is deleted if a) the resulting .ptr is unused, b) N == 0, or c) both arr.length and N are constant integers, and N <= arr.length. I'd like to extend this one to a more general N <= arr.length (i.e. not just constant integers), but I'm not quite sure what the best way to implement it is yet. * For "cast(T[]) some_array", the compiler generates a runtime call to compute the new array length. This call will be optimized out if a) the old length was 0, b) T.sizeof == U.sizeof, where U is the element type of some_array, or c) T.sizeof % U.sizeof == 0 * arr1[] = arr2[] is turned into a memcpy() if alias analysis can prove they don't overlap. (Only relevant if assertions or array bounds checks are enabled, as they both are by default, otherwise they're turned into memcpy() in the first place) * Runtime calls that don't do anything but allocate GC memory (and optionally initialize it) are deleted if their return value is unused.* simplify or remove certain calls to D runtime functionsWhat calls?
May 27 2009
Frits van Bommel: Thank you for your answers.This one is only done for certain GC allocations by the way, not all of them. The ones currently implemented are: * new Struct/int/float/etc., * uninitialized arrays (used for arr1 ~ arr2, for instance), * zero-initialized arrays (e.g. new int[N]) * new Class, unless a) it has a destructor, b) it has a custom allocator (overloads new), or c) it has a custom deallocator (overloads delete).I'm trying to find situations where that's true, but in two small programs that use both structs and classes (that don't escape the scope and follow your unless list) I see: call _d_allocmemoryT call _d_allocclass Are those calls to variants of alloca()? While looking for those alloca I have also tested code that has the following two lines one after the other: auto a = new int[1000]; a[] = 2; That code is very common, because you currently can't write: auto a = new int[1000] = 2; The latest LDC compiles that as: pushl %esi subl $4016, %esp leal 16(%esp), %esi movl %esi, (%esp) movl $4000, 8(%esp) movl $0, 4(%esp) call memset movl %esi, (%esp) movl $2, 8(%esp) movl $1000, 4(%esp) call _d_array_init_i32 I think the memset may be avoided. Bye and thank you, bearophile
May 27 2009
bearophile wrote:Frits van Bommel: Thank you for your answers.No, those are GC allocations. This small program contains no gc allocations with ldc -O3: ----- struct Struct { int i, j = 4; } class Class { int i, j = 6; } int frob(T)(T t) { t.i = 4; return t.j; } int withStruct() { return frob(new Struct); } int withClass() { return frob(new Class); } ----- It does still contain them when inlining is disabled, as it is by default with -O2 (aka -O); this seems to be because the LLVM pass that adds parameter attributes (like nocapture, better known as 'scope' in these newsgroups) is missing from the default list of optimizations :(. I'll fix this in the repository soon. Another constraint I forgot to mention: it doesn't work for allocations in loops, because it's tricky to figure out whether the allocation is still reachable when the loop reaches the same position again. (For this reason, the pass by default runs before each inliner run and once after all inlining is done since the inliner can inline code into loops, yet allows for simplifications that make escape analysis more accurate)This one is only done for certain GC allocations by the way, not all of them. The ones currently implemented are: * new Struct/int/float/etc., * uninitialized arrays (used for arr1 ~ arr2, for instance), * zero-initialized arrays (e.g. new int[N]) * new Class, unless a) it has a destructor, b) it has a custom allocator (overloads new), or c) it has a custom deallocator (overloads delete).I'm trying to find situations where that's true, but in two small programs that use both structs and classes (that don't escape the scope and follow your unless list) I see: call _d_allocmemoryT call _d_allocclass Are those calls to variants of alloca()?While looking for those alloca I have also tested code that has the following two lines one after the other: auto a = new int[1000]; a[] = 2; That code is very common, because you currently can't write: auto a = new int[1000] = 2; The latest LDC compiles that as: pushl %esi subl $4016, %esp leal 16(%esp), %esi movl %esi, (%esp) movl $4000, 8(%esp) movl $0, 4(%esp) call memset movl %esi, (%esp) movl $2, 8(%esp) movl $1000, 4(%esp) call _d_array_init_i32 I think the memset may be avoided.That's trickier to get right, because the optimizer would have to look ahead to see the new memset call is always followed by the initialization, with no reads in between. The 1-byte element case can probably be handled by LLVM if _d_array_init_i8 is replaced by another memset, though. (and similarly, _d_array_init_i16 could be handled for cases like 0xFFFF, but not 0x1234, by turning it into memset).
May 27 2009
Frits van Bommel: Thanks for your answers (and your work).That's trickier to get right, because the optimizer would have to look ahead to see the new memset call is always followed by the initialization, with no reads in between.I understand, and that may be more complex to do if the code is multi-thread. It's not a very important optimization, because most times the initialization time is a small percentage of the time spent to process the array. But it may deserve to receive a look as a medium-low-priority optimization anyway. Bye, bearophile
May 27 2009
First of all: Thanks for your your great work. Unfortunately I still have the debugging problem already described in the debugger group (using the x86-64 build on Ubuntu 9.04). I compile a programm using ldmd -g -debug test.d Then I try to debug using gdb with the D patches: (gdb) list 1 ../sysdeps/x86_64/elf/start.S: No such file or directory. in ../sysdeps/x86_64/elf/start.S Any hints on this? Thanks and best regards, Timo
May 27 2009
Timo Gransch wrote:I compile a programm using ldmd -g -debug test.d Then I try to debug using gdb with the D patches: (gdb) list 1 ../sysdeps/x86_64/elf/start.S: No such file or directory. in ../sysdeps/x86_64/elf/start.SOn x86-32 that gives me a listing of the main function defined in the D runtime - but I am using a debug runtime. Does inserting a breakpoint in your code and running to that work?
May 28 2009
Christian Kamm schrieb:On x86-32 that gives me a listing of the main function defined in the D runtime -On Arch Linux/32 (using the official ldc binary), list prints the source code of the compiled file, just the way it's supposed to. (gdb) list 1 import tango.io.Console; 2 3 int main(char[][] args) 4 { 5 for (int i = 0; i < args.length; i++) 6 { 7 Cout(args[i] ~ "\n"); 8 } 9 10 return 0;but I am using a debug runtime. Does inserting a breakpoint in your code and running to that work?Back on x86-64 again: (gdb) break main Breakpoint 1 at 0x409150 (gdb) run Starting program: /home/timo/tmp/testd/test [Thread debugging using libthread_db enabled] [New Thread 0x7fb54f2456f0 (LWP 7001)] [Switching to Thread 0x7fb54f2456f0 (LWP 7001)] Breakpoint 1, 0x0000000000409150 in main () Current language: auto; currently asm (gdb) step Single stepping until exit from function main, which has no line number information. 0x000000000040a830 in _STI_monitor_staticctor () (gdb) step Single stepping until exit from function _STI_monitor_staticctor, which has no line number information. 0x0000000000409183 in main () If I try to run list after that, the error message is different: (gdb) list 1 /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S: No such file or directory. in /build/buildd/glibc-2.9/build-tree/amd64-libc/csu/crtn.S Thanks and best regards, Timo
May 28 2009
Timo Gransch wrote:Christian Kamm schrieb:Since there's main and _Dmain and I don't know how the GDB patches interact with breakpoint setting, can you try to make a breakpoint on the first line of your D main function (i.e. b myfile.d:15) and run to that? I'm now also subscribed to D.debugger and saw your post there. Let's move the discussion.but I am using a debug runtime. Does inserting a breakpoint in your code and running to that work?Back on x86-64 again: (gdb) break main Breakpoint 1 at 0x409150
May 29 2009
Christian Kamm schrieb:I'm now also subscribed to D.debugger and saw your post there. Let's move the discussion.I appended my answer to the existing thread 'Debugging LDC executables'. Best regards, Timo
May 30 2009
While this code: typedef int Int2 = 2; auto a = cast(int[])(new Int2[1000]); Produces: pushl %esi subl $8, %esp movl $1000, 4(%esp) movl $_D20TypeInfo_ATmain4Int26__initZ, (%esp) xorl %esi, %esi call _d_newarrayiT movl %esi, %ecx (I haven't taken the running time, so I don't know if this idiom is more efficient with LDC). Bye, bearophile
May 27 2009
bearophile wrote:While this code: typedef int Int2 = 2; auto a = cast(int[])(new Int2[1000]); Produces: pushl %esi subl $8, %esp movl $1000, 4(%esp) movl $_D20TypeInfo_ATmain4Int26__initZ, (%esp) xorl %esi, %esi call _d_newarrayiT movl %esi, %ecx (I haven't taken the running time, so I don't know if this idiom is more efficient with LDC).For arrays that escape, it's quite probably more efficient since it only gets initialized once this way. For arrays that can get stack-promoted it may not be, because (non zero-)initialized arrays aren't eligible for that yet (as you can tell by the _d_newarray* call, which GC-allocates a new array and initializes it). So which is more efficient in that case depends on whether a GC allocation is more expensive than re-initializing 4 KB of data.
May 27 2009
Great news, happy to see x86_64 on the feature list :)
May 27 2009