[M3devel] higher level m3cg?

Jay jay.krell at cornell.edu
Thu Aug 16 20:43:02 CEST 2012


Btw, while I claimed to ignore them...a higher level information about exception handling to the backend might be good. & possibly loops. It really just depends on what the backend is outputting & how much work it is willing to do. There is kind of this "gradual lowering" going on..but sometimes things get "reraised".
 

I guess really there is no canonical set in stone interface & implementation. We'll figure it out gradually. But I also am not as familiar with the system as I would like.


On the matter of exception handling, it 'd likely be good to generate __try for NT platforms and C++ try otherwise. It'd likely make things more efficient. 
But that would snowball a bit -- generating the catch/__except code would likely require other higher level information.


On the matter of LLVM I don't expect to have the time/motivation.


Anyway, I'll press on for asis.
I have to figure out something for nested functions...


 - Jay (briefly/pocket-sized-computer-aka-phone)

On Aug 16, 2012, at 11:06 AM, Antony Hosking <hosking at cs.purdue.edu> wrote:

> Yes, I've thought so for a long time. It would also more easily enable llvm. 
> 
> Sent from my iPhone
> 
> On Aug 16, 2012, at 10:21, Jay K <jay.krell at cornell.edu> wrote:
> 
>> Should m3cg provide enough information for a backend to generate idiomatic C?
>> (What is idiomatic C? e.g. I'm ignoring loop constructs and exception handlinh..)
>> 
>> 
>> Should we make it so?
>> 
>> 
>> Or be pragmatic and see if anyone gets to that point?
>> 
>> 
>> But, look at this another way.
>> Let's say we are keeping the gcc backend.
>> 
>> 
>> Isn't it reasonable to have a better experience with stock gdb?
>> 
>> 
>> What should m3cg look like then?
>> 
>> 
>> Matching up m3front to gcc turns out to be "wierd".
>> As does having a backend generate "C".
>> 
>> 
>> In particular, "wierd" because there is a "level mismatch".
>> 
>> 
>> m3cg presents a fairly low level view of the program.
>>   It does layout. Global variables are stuffed into what you might call a "struct", with
>> no assigned field names. Field references are done by adding to addresses and casting.
>> 
>> 
>> Too low level to provide a "good" gcc tree representation or to generate "normal" C.
>> 
>> 
>> One might be able to, by somewhat extraordinary means, make due.
>> That is, specifically one could deduce field references from
>> offsets/sizes. But maybe it is reasonable for load/store
>> to include fields? Maybe in addition to what it provides?
>> 
>> 
>> As well, it appears to me, that
>> 
>> 
>> given TYPE Enum = {One, Two, Three};
>> 
>> the m3cg is like:
>> 
>> declare enum typeidblah
>> declare enum_elt One
>> declare enum_elt Two
>> declare enum_elt Three
>> declare_typename typeidblah Enum
>> 
>> 
>> One kind of instead wants more like:
>> 
>> 
>> declare enum typeidblah Enum
>> declare enum_elt One => rename it Enum_One
>> declare enum_elt Two ""
>> declare enum_elt Three ""
>> 
>> 
>> However I understand that {One, Two, Three} exists
>> as anonymous type independent of the name "Enum".
>> 
>> 
>> One could just as well have:
>> given TYPE Enum1 = {One, Two, Three};
>> given TYPE Enum2 = {One, Two, Three};
>> 
>> 
>> Enum1 and Enum2 probably have the same typeid, and are just
>> two typenames for the same type.
>> 
>> 
>> likewise:
>> given TYPE Enum1 = {One, Two, Three};
>> given TYPE Enum2 = Enum1;
>> 
>> 
>> but, pragmatically, in the interest of generating better C,
>> can we pass a name along with declare_enum?
>> 
>> I ask somewhat rhetorically. I realize there is the answer:
>>   enum Mtypeid { Mtypeid_One, Mtypeid_Two, Mtypeid_Three };
>>   typedef enum Mtypeid Enum1;
>> 
>> 
>> Also, enum variables I believe end up as just UINT8, 16, or 32.
>> Loads of enum values I believe end up as just loads of integers.
>> Can we pass along optional enum names with declare_local/declare_param?
>> And optional enum names with load_int?
>> Or add a separate load_enum call?
>> 
>> 
>> Really, I understand that the current interface can be pressed to do
>> pretty adequate things. I can infer field references. The way enums work
>> isn't too bad.
>> 
>> 
>>  - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20120816/4ef63d09/attachment-0002.html>


More information about the M3devel mailing list