For the most part, it appears that writing a front end can be almost entirely platform-independent. For example, my front end doesn't know how big a pointer is, and for the most part doesn't care. All of the platform-specific aspects of compilation have, up to this point, been hidden behind the IR. However, where things get tricky is in calling C functions that take a size_t as a parameter. Since a size_t is the same size as a pointer, it may be either 32 or 64 bits depending on the target platform. All of a sudden, I can no longer generate 'target-neutral' IR, but instead must introduce into the front end knowledge about the target platform. So my questions are: 1) Is there a way to declare an integer type in the IR that represents "an int the same size as a pointer" without specifying exactly the size of a pointer? 2) Assuming the above answer is "no", what's the best way for the front end to measure the size of a pointer? -- Talin
On May 6, 2008, at 11:12 PM, Talin wrote:> For the most part, it appears that writing a front end can be almost > entirely platform-independent. For example, my front end doesn't know > how big a pointer is, and for the most part doesn't care. All of the > platform-specific aspects of compilation have, up to this point, been > hidden behind the IR.Nice.> However, where things get tricky is in calling C functions that take a > size_t as a parameter. Since a size_t is the same size as a pointer, > it > may be either 32 or 64 bits depending on the target platform. All of a > sudden, I can no longer generate 'target-neutral' IR, but instead must > introduce into the front end knowledge about the target platform.Right, this is ugliness of C. :( Remember that even the size of int (and certainly the size of long!) is target specific as well. This implies that you cannot generate truly portable interfaces to C code if they take an int.> So my questions are: > > 1) Is there a way to declare an integer type in the IR that represents > "an int the same size as a pointer" without specifying exactly the > size > of a pointer?No.> 2) Assuming the above answer is "no", what's the best way for the > front > end to measure the size of a pointer?It doesn't help for interfacing to C, but you can do things like this: http://llvm.org/docs/tutorial/LangImpl8.html#offsetofsizeof If you want to generate a constant as a Value* in the IR. For emitting the right sized integer type, I'm afraid that your front- end needs to know the size of the integer. If you are willing to accept an ugly hack that works almost always on common targets, you can just declare the size_t argument *as being a pointer*, and use inttoptr to pass it. This works because common ABIs pass integers and pointers the same way. -Chris
On Tue, 2008-05-06 at 23:18 -0700, Chris Lattner wrote:> > 1) Is there a way to declare an integer type in the IR that represents > > "an int the same size as a pointer" without specifying exactly the > > size > > of a pointer? > > No.Chris: There are other languages that specify a "word" type along these lines. Would it be worth considering adding such a type to the IR, or is there a reason not to do so that I am failing to see? shap
On a related topic: The source-level debugging descriptors require you to know up front what the sizeof pointer types are. Is there any hope of the frontend remaining blissfully unaware of platform details? Chris Lattner wrote:> On May 6, 2008, at 11:12 PM, Talin wrote: > > >> For the most part, it appears that writing a front end can be almost >> entirely platform-independent. For example, my front end doesn't know >> how big a pointer is, and for the most part doesn't care. All of the >> platform-specific aspects of compilation have, up to this point, been >> hidden behind the IR. >> > > Nice. > > >> However, where things get tricky is in calling C functions that take a >> size_t as a parameter. Since a size_t is the same size as a pointer, >> it >> may be either 32 or 64 bits depending on the target platform. All of a >> sudden, I can no longer generate 'target-neutral' IR, but instead must >> introduce into the front end knowledge about the target platform. >> > > Right, this is ugliness of C. :( Remember that even the size of int > (and certainly the size of long!) is target specific as well. This > implies that you cannot generate truly portable interfaces to C code > if they take an int. > > >> So my questions are: >> >> 1) Is there a way to declare an integer type in the IR that represents >> "an int the same size as a pointer" without specifying exactly the >> size >> of a pointer? >> > > No. > > >> 2) Assuming the above answer is "no", what's the best way for the >> front >> end to measure the size of a pointer? >> > > It doesn't help for interfacing to C, but you can do things like this: > http://llvm.org/docs/tutorial/LangImpl8.html#offsetofsizeof > > If you want to generate a constant as a Value* in the IR. > > For emitting the right sized integer type, I'm afraid that your front- > end needs to know the size of the integer. > > > If you are willing to accept an ugly hack that works almost always on > common targets, you can just declare the size_t argument *as being a > pointer*, and use inttoptr to pass it. This works because common ABIs > pass integers and pointers the same way. > > -Chris > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >