Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Walter Bright via Digitalmars-d

On 7/10/2017 12:53 PM, Luís Marques wrote:

On Monday, 10 July 2017 at 19:41:48 UTC, Walter Bright wrote:

What is the goal/reason/rationale for making a 16 bit D target?


- I program for MSP430
- I'm tired of C's limitation
- LDC works with MSP430


Those are quite understandable goals. I'm curious how the issues I brought up 
are addressed, however.


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Brad Roberts via Digitalmars-d

On 7/10/17 10:49 AM, Luís Marques via Digitalmars-d wrote:

On Monday, 10 July 2017 at 17:32:01 UTC, Iain Buclaw wrote:
The official stance is that we don't.  There is just far too much 
baggage that gets piled in by default that makes it very hostile, 
however those of us who are capable of doing so won't try to stop you, 
and you have the likes of minilibd and other minimal D libraries as 
friendly replacement, perhaps you could even use them on top of musl. ;-)


By "we don't" it seems you are referring to supporting D + druntime + 
Phobos. But, to clarify, plain -betterC D seems to work well. One issue 
is that size_t currently has the wrong size, and changing it involves at 
least some druntime support (changing object.d, and changing all of the 
size_t line = __LINE__ fallout).


BTW, I wasn't sure how I should go about changing druntime and Phobos 
regarding the size_t line -> line_t line transition. I opted to change 
LDC's fork of druntime first, because it seemed to me like the 
contribution had a better chance of being accepted, and afterwards make 
a separate dlang/druntime pull request. But the more natural way would 
probably be to change the canonical druntime first and then merge the 
changes on the LDC side, no?


- Luís


I think this is a great example of a project where the best path is to 
fork the compiler, runtime, and phobos (if you intend to go that high up 
the stack) and just go do it.  Don't worry, for the short term, about 
any of the naming issues, mergability, etc.  Make it work, use it, learn 
what the big issues are, etc.  Then, cycle back and look at how to 
merge.  I suspect there's going to be a lot of issues and finding out 
what's important to disucss in what order is useful.  Getting bogged 
down early is going to be frustrating.


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Luís Marques via Digitalmars-d

On Monday, 10 July 2017 at 19:41:48 UTC, Walter Bright wrote:

What is the goal/reason/rationale for making a 16 bit D target?


- I program for MSP430
- I'm tired of C's limitation
- LDC works with MSP430


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Walter Bright via Digitalmars-d

On 7/10/2017 5:41 AM, Luís Marques wrote:

for 16 bit targets


Having developed C/C++ on 16 bit targets for a couple decades, I have some 
curmudgeonly perspective.


1. having __LINE__ as size_t is madness. If I was responsible for that, shame 
on me.

2. a 16 bit type for 16 bit targets is plenty good enough. Consider that 32 bits 
on 16 bit targets is code bloat EXPENSIVE, and code bloat is a huge problem on 
16 bit targets. You're just not going to have 64000 line files, because the 
generated code won't fit in 16 bits. Even if you constructed a case, having the 
counter wrap around is little more than a very minor aggravation.


3. C++ worked on 16 bit code before exceptions and RTTI. Exceptions and RTTI are 
completely unworkable on 64K machines, and even on 640K machines. The STL is 
completely unworkable on 640K machines, because it is just too big.


4. 640K programming in C++ is not practical without near/far support. D has no 
such support, and neither does Standard C++.


5. C++ on a 64K machine is like using a tank to get to the grocery store.

6. __LINE__ is typed `unsigned` everywhere I've seen, including with 16 bit 
compilers.


== Some Conclusions ==

1. __LINE__ should be `uint`. Negative lines make no sense.

2. Exceptions are useless on 16 bits, so class Exception has no purpose.

3. D doesn't have near/far and won't be suitable for 640K programming.

4. D for 64K programming is possible in 'betterC' mode.

5. D's 32 bit int sizes are not very workable for 16 bit code. shorts will be 
promoted to 32 bits. Trying to change this in the compiler logic for 16 bit 
targets is an unknown amount of work.


6. D for 16 bits wouldn't really be D, it would be a D variant with different 
semantics and capabilities. (Like C++ for 16 bits.)


== Bottom Line ==

Trying to make D into a useful compiler for 16 bit programming is a bit of a 
quixotic quest. But it probably could be bludgeoned into doing something 
credible with it if needed to satisfy a bullet point requirement. __LINE__'s 
type is hardly the only problem.


What is the goal/reason/rationale for making a 16 bit D target?


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Luís Marques via Digitalmars-d
On Monday, 10 July 2017 at 18:03:27 UTC, Steven Schveighoffer 
wrote:
I think it's reasonable to instrument druntime/phobos with 
line_t, and then libraries may or may not work with 16-bit (I 
wouldn't be surprised if most don't), but at least they will 
likely work for files less than 65k lines (quite a few) :)


Right, since for 32- and 64-bit code line_t is an alias for 
size_t, nothing breaks.


I will review and approve such a request if you make it. You'd 
likely need buy-in from Andrei.


That's nice. So maybe I should submit for the canonical druntime 
first and ask for a merge on the LDC side?


BTW, if you want to help bikeshed the name for the 16-bit version 
identifier name, there's still time... 



D_P16? D_16? Something else?


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Steven Schveighoffer via Digitalmars-d

On 7/10/17 1:49 PM, Luís Marques wrote:

On Monday, 10 July 2017 at 17:32:01 UTC, Iain Buclaw wrote:
The official stance is that we don't.  There is just far too much 
baggage that gets piled in by default that makes it very hostile, 
however those of us who are capable of doing so won't try to stop you, 
and you have the likes of minilibd and other minimal D libraries as 
friendly replacement, perhaps you could even use them on top of musl. ;-)


By "we don't" it seems you are referring to supporting D + druntime + 
Phobos. But, to clarify, plain -betterC D seems to work well. One issue 
is that size_t currently has the wrong size, and changing it involves at 
least some druntime support (changing object.d, and changing all of the 
size_t line = __LINE__ fallout).


I think it's reasonable to instrument druntime/phobos with line_t, and 
then libraries may or may not work with 16-bit (I wouldn't be surprised 
if most don't), but at least they will likely work for files less than 
65k lines (quite a few) :)


e.g. this should work fine if super takes a line_t:

class MyException : Exception
{
  this(string msg, size_t line = __LINE__, string file = __FILE__)
  {
super(msg, line, file);
  }
}

I will review and approve such a request if you make it. You'd likely 
need buy-in from Andrei.


-Steve


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Luís Marques via Digitalmars-d

On Monday, 10 July 2017 at 17:32:01 UTC, Iain Buclaw wrote:
The official stance is that we don't.  There is just far too 
much baggage that gets piled in by default that makes it very 
hostile, however those of us who are capable of doing so won't 
try to stop you, and you have the likes of minilibd and other 
minimal D libraries as friendly replacement, perhaps you could 
even use them on top of musl. ;-)


By "we don't" it seems you are referring to supporting D + 
druntime + Phobos. But, to clarify, plain -betterC D seems to 
work well. One issue is that size_t currently has the wrong size, 
and changing it involves at least some druntime support (changing 
object.d, and changing all of the size_t line = __LINE__ fallout).


BTW, I wasn't sure how I should go about changing druntime and 
Phobos regarding the size_t line -> line_t line transition. I 
opted to change LDC's fork of druntime first, because it seemed 
to me like the contribution had a better chance of being 
accepted, and afterwards make a separate dlang/druntime pull 
request. But the more natural way would probably be to change the 
canonical druntime first and then merge the changes on the LDC 
side, no?


- Luís


Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Iain Buclaw via Digitalmars-d
On 10 July 2017 at 17:56, Luís Marques via Digitalmars-d
 wrote:
> On 10/07/2017 14:31, Jonathan M Davis via Digitalmars-d wrote:
>>
>> I didn't think that D supported 16-bit targets at all. Do ldc and/or gdc
>> support 16-bit targets of some kind?
>
>
> LDC accepts -mtriple=msp430 with some small tweaks. This issue arose as I as
> working on a proper implementation of those tweaks, to be accepted for
> inclusion in LDC.
>

The official stance is that we don't.  There is just far too much
baggage that gets piled in by default that makes it very hostile,
however those of us who are capable of doing so won't try to stop you,
and you have the likes of minilibd and other minimal D libraries as
friendly replacement, perhaps you could even use them on top of musl.
;-)

The same arguments that are normally brought up about C++ being used
on 16bit processors also apply to D I guess.

Iain.



Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Luís Marques via Digitalmars-d

On 10/07/2017 14:31, Jonathan M Davis via Digitalmars-d wrote:

I didn't think that D supported 16-bit targets at all. Do ldc and/or gdc
support 16-bit targets of some kind?


LDC accepts -mtriple=msp430 with some small tweaks. This issue arose as 
I as working on a proper implementation of those tweaks, to be accepted 
for inclusion in LDC.




Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Jonathan M Davis via Digitalmars-d
On Monday, July 10, 2017 9:22:01 AM MDT Steven Schveighoffer via 
Digitalmars-d wrote:
> On 7/10/17 8:41 AM, Luís Marques wrote:
> > 1) Change `size_t line` to `int line`. The line is already 32 bits under
> > the covers (and I don't see the need to change that). The only issue
> > might be code breakage.
>
> Not might, will. All exception derivatives call super(msg, file, line),
> which won't work if your exception defines its ctor with size_t line =
> __LINE__.
>
> > 2) Make __LINE__ 16-bit for 16-bit targets. I don't think this option
> > makes much sense.

I didn't think that D supported 16-bit targets at all. Do ldc and/or gdc
support 16-bit targets of some kind?

- Jonathan M Davis




Re: size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Steven Schveighoffer via Digitalmars-d

On 7/10/17 8:41 AM, Luís Marques wrote:

1) Change `size_t line` to `int line`. The line is already 32 bits under 
the covers (and I don't see the need to change that). The only issue 
might be code breakage.


Not might, will. All exception derivatives call super(msg, file, line), 
which won't work if your exception defines its ctor with size_t line = 
__LINE__.


2) Make __LINE__ 16-bit for 16-bit targets. I don't think this option 
makes much sense.


Agree.

3) Create a line_t type (in object.d?). Make it 32-bit for 16- and 
32-bit targets, and 64-bit for 64-bit targets. That's for avoiding 
breakage, not because >4 B lines is actually needed, IMO.


Only sensible option at this point. And I agree it should be done.

-Steve


size_t.sizeof == 2 && __LINE__.sizeof == 4

2017-07-10 Thread Luís Marques via Digitalmars-d

Hello,

We have a few cases where __LINE__ is assigned to a size_t. For 
instance:


class Exception : Throwable
{
@nogc @safe pure nothrow this(string msg, string file = 
__FILE__, size_t line = __LINE__, Throwable next = null)

{
super(msg, file, line, next);
}

__LINE__ is currently defined as 32 bits in LineInitExp 
(Type.tint32). For 32 and 64 bit targets these assignments are 
not a problem (they are either a plain copy or a 0 extension), 
but for 16 bit targets (e.g. MSP430) these are problematic 
because you can't assign the 32-bit __LINE__ value to the 16-bit 
size_t line variable without a cast.


IMO, using size_t for lines is silly, for several reasons:

1. There's no reason why 16-bit targets can't have source code 
with more than 64 K lines;


2. There's probably no good reason to support more than 4 B lines 
of source code;


3. If we *do* want support more than 4 B lines of source code, 
there's no reason to make that support conditional on whether the 
*target* is 32- or 64-bit. Even if we assume the compiler has to 
hold all of the lines in main memory, that's a property of the 
host, not the target.


If see a few ways to move forward:

1) Change `size_t line` to `int line`. The line is already 32 
bits under the covers (and I don't see the need to change that). 
The only issue might be code breakage.


2) Make __LINE__ 16-bit for 16-bit targets. I don't think this 
option makes much sense.


3) Create a line_t type (in object.d?). Make it 32-bit for 16- 
and 32-bit targets, and 64-bit for 64-bit targets. That's for 
avoiding breakage, not because >4 B lines is actually needed, IMO.


I suggest following 3 -- even though I think option 1 would be 
the right one for a day-1 design. (This option also allows 
eventually making line_t 32-bit on 64-bit targets, if people 
start using line_t instead of size_t).


What do you think?

Luís