+++ /dev/null
-Changes:
-* Change the casting code to be const correct. Now, doing this is invalid:
- const Value *V = ...;
- Instruction *I = dyn_cast<Instruction>(V);
- instead, the second line should be:
- const Instruction *I = dyn_cast<Instruction>(V);
-
-* Change the casting code to allow casting a reference value thus:
- const Value &V = ...;
- Instruction &I = cast<Instruction>(V);
-
- dyn_cast does not work with references, because it must return a null pointer
- on failure.
-
-* Fundamentally change how instructions and other values are represented.
- Before, every llvm container was an instance of the ValueHolder template,
- instantiated for each container type. This ValueHolder was effectively a
- wrapper around a vector of pointers to the sub-objects.
-
- Now, instead of having a vector to pointers of objects, the objects are
- maintained in a doubly linked list of values (ie each Instruction now has
- Next & Previous fields). The containers are now instances of ilist (intrusive
- linked list class), which use the next and previous fields to chain them
- together. The advantage of this implementation is that iterators can be
- formed directly from pointers to the LLVM value, and invalidation is much
- easier to handle.
-
-* As part of the above change, dereferencing an iterator (for example:
- BasicBlock::iterator) now produces a reference to the underlying type (same
- example: Instruction&) instead of a pointer to the underlying object. This
- makes it much easier to write nested loops that iterator over things, changing
- this:
-
- for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
- for (BasicBlock::iterator II = (*BI)->begin(); II != (*BI)->end(); ++II)
- (*II)->dump();
-
- into:
-
- for (Function::iterator BI = Func->begin(); BI != Func->end(); ++BI)
- for (BasicBlock::iterator II = BI->begin(); II != BI->end(); ++II)
- II->dump();
-
- which is much more natural and what users expect.
-
-* Simplification of #include's: Before, it was necessary for a .cpp file to
- include every .h file that it used. Now things are batched a little bit more
- to make it easier to use. Specifically, the include graph now includes these
- edges:
- Module.h -> Function.h, GlobalVariable.h
- Function.h -> BasicBlock.h, Argument.h
- BasicBlock.h -> Instruction.h
-
- Which means that #including Function.h is usually sufficient for getting the
- lower level #includes.
-
-* Printing out a Value* has now changed: Printing a Value* will soon print out
- the address of the value instead of the contents of the Value. To print out
- the contents, you must convert it to a reference with (for example)
- 'cout << *I' instead of 'cout << I;'. This conversion is not yet complete,
- but will be eventually. In the mean time, both forms print out the contents.
-
-* References are used much more throughout the code base. In general, if a
- pointer is known to never be null, it is passed in as a reference instead of a
- pointer. For example, the instruction visitor class uses references instead
- of pointers, and that Pass subclasses now all receive references to Values
- instead of pointers, because they may never be null.
-
-* The Function class now has helper functions for accessing the Arguments list.
- Instead of having to go through getArgumentList for simple things like
- iterator over the arguments, now the a*() methods can be used to access them.
-