Thursday, February 25, 2010
Reminder - LALR(1) quiz tomorrow (Friday)
Remember, tomorrow (26 Feb) I will give a quiz (short midterm) so you can show that you've mastered the LR(0) and LALR(1) parsing material that gave you trouble on the first midterm.
Object code lecture notes
Here are my lecture slides on LLVM IR code generation (up to data flow analysis, which I posted yesterday). Some of these have been posted before, but I think the first of those below, on walking the AST to generate LLVM IR, has not.
- From AST to IR (expressions, control flow, short-circuit conditions)
- Addressing in LLVM, Where things live and More on LLVM addressing of objects
Wednesday, February 24, 2010
Data flow analysis intro slides
Here are the slides I used today, with a couple of corrections to the mistakes you caught. (There might be more mistakes ... please let me know if you spot one.)
Clang and C++
I experimented a bit with how Clang compiles C++, but I'm not sure it provides much guidance. With the classes:
class Rect { ... };
class Square : public Rect { ... };
I end up with the llvm type declarations:
%class.Rect = type { i32, i32, i32, i32 }
%class.Square = type { [16 x i8] }
It does use bitcast to call inherited methods:
%0 = bitcast %class.Square* %s to %class.Rect* ; <%class.Rect*> [#uses=1]
call void @_ZN4Rect9setBoundsEiiii(%class.Rect* %0, i32 0, i32 0, i32 10, i32 10)
%call = call i32 @_ZN6Square4areaEv(%class.Square* %s) ; [#uses=1]
The strange names like "_ZN4Rect9setBoundsEiiii" are from "name mangling" in C++, which is how C++ provides overloading while maintaining compatibility with C which does not. The source code name is "setBounds", and the random junk is added to make it unique.
My C++ mojo has not been sufficient so far to really figure out how the dynamic dispatch is working, but it at least appears that the Clang front end (which is not as complete as the gcc front end) is using casts instead of using nested structures. That doesn't mean nested structures is a bad idea ... I think either way should work.
class Rect { ... };
class Square : public Rect { ... };
I end up with the llvm type declarations:
%class.Rect = type { i32, i32, i32, i32 }
%class.Square = type { [16 x i8] }
It does use bitcast to call inherited methods:
%0 = bitcast %class.Square* %s to %class.Rect* ; <%class.Rect*> [#uses=1]
call void @_ZN4Rect9setBoundsEiiii(%class.Rect* %0, i32 0, i32 0, i32 10, i32 10)
%call = call i32 @_ZN6Square4areaEv(%class.Square* %s) ;
The strange names like "_ZN4Rect9setBoundsEiiii" are from "name mangling" in C++, which is how C++ provides overloading while maintaining compatibility with C which does not. The source code name is "setBounds", and the random junk is added to make it unique.
My C++ mojo has not been sufficient so far to really figure out how the dynamic dispatch is working, but it at least appears that the Clang front end (which is not as complete as the gcc front end) is using casts instead of using nested structures. That doesn't mean nested structures is a bad idea ... I think either way should work.
Thursday, February 18, 2010
Lecture notes for Friday (more fun with addresses)
Tomorrow's slides (Friday 19 Feb) are here
It's pretty much a continuation of Wednesday's look at how we address things in LLVM, starting with a repeat of the last slide of LLVM code from Wednesday. Normally I try not to stuff quite so much onto each slide, but in this case I really wanted stuff side-by-side, so we can compare between C and LLVM code. There is also a slide that shows how the LLVM code becomes assembly code (with x86 assembly; of course it will look a little different if you produce assembly code for a different machine architecture).
It's pretty much a continuation of Wednesday's look at how we address things in LLVM, starting with a repeat of the last slide of LLVM code from Wednesday. Normally I try not to stuff quite so much onto each slide, but in this case I really wanted stuff side-by-side, so we can compare between C and LLVM code. There is also a slide that shows how the LLVM code becomes assembly code (with x86 assembly; of course it will look a little different if you produce assembly code for a different machine architecture).
Wednesday, February 17, 2010
LLVM web interface
Try the online LLVM demo to compile bits of C code into LLVM intermediate representation. Also you can meet Bitter Melon, one of the smartest cats I have been introduced to. Most cats are not very good programmers, because they are too easily distracted.
Thanks Kristy for the tip.
Thanks Kristy for the tip.
LLVM addressing slides
My slides for today's lecture (Wednesday 17 Feb) are full of example code ... it might be useful to have a printed copy, or an online copy to refer to. A PDF version is here.
Subscribe to:
Posts (Atom)
