[llvm-commits] [dragonegg] r165487 - /dragonegg/trunk/www/disambiguate.diff

Duncan Sands baldrick at free.fr
Tue Oct 9 00:23:00 PDT 2012


Author: baldrick
Date: Tue Oct  9 02:23:00 2012
New Revision: 165487

URL: http://llvm.org/viewvc/llvm-project?rev=165487&view=rev
Log:
Remove mysterious file.

Removed:
    dragonegg/trunk/www/disambiguate.diff

Removed: dragonegg/trunk/www/disambiguate.diff
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/www/disambiguate.diff?rev=165486&view=auto
==============================================================================
--- dragonegg/trunk/www/disambiguate.diff (original)
+++ dragonegg/trunk/www/disambiguate.diff (removed)
@@ -1,7038 +0,0 @@
-diff -r -u -N dragonegg-2.9-old/ABI.h dragonegg-2.9-new/ABI.h
---- dragonegg-2.9-old/ABI.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/ABI.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,351 +0,0 @@
--//===--------- ABI.h - Processor ABI customization hooks --------*- C++ -*-===//
--//
--// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011  Chris Lattner,
--// Duncan Sands et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file specifies how argument values are passed and returned from function
--// calls.  This allows the target to specialize handling of things like how
--// structures are passed by-value.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_ABI_H
--#define DRAGONEGG_ABI_H
--
--// Plugin headers
--#include "Internals.h"
--#include "Target.h"
--
--// LLVM headers
--#include "llvm/LLVMContext.h"
--#include "llvm/DataLayout.h"
--
--namespace llvm {
--  class BasicBlock;
--}
--
--/// DefaultABIClient - This is a simple implementation of the ABI client
--/// interface that can be subclassed.
--struct DefaultABIClient {
--  virtual ~DefaultABIClient() {}
--  virtual CallingConv::ID& getCallingConv(void) = 0;
--  virtual bool isShadowReturn() const { return false; }
--
--  /// HandleScalarResult - This callback is invoked if the function returns a
--  /// simple scalar result value, which is of type RetTy.
--  virtual void HandleScalarResult(const Type * /*RetTy*/) {}
--
--  /// HandleAggregateResultAsScalar - This callback is invoked if the function
--  /// returns an aggregate value by bit converting it to the specified scalar
--  /// type and returning that.  The bit conversion should start at byte Offset
--  /// within the struct, and ScalarTy is not necessarily big enough to cover
--  /// the entire struct.
--  virtual void HandleAggregateResultAsScalar(const Type * /*ScalarTy*/,
--                                             unsigned /*Offset*/ = 0) {}
--
--  /// HandleAggregateResultAsAggregate - This callback is invoked if the function
--  /// returns an aggregate value using multiple return values.
--  virtual void HandleAggregateResultAsAggregate(const Type * /*AggrTy*/) {}
--
--  /// HandleAggregateShadowResult - This callback is invoked if the function
--  /// returns an aggregate value by using a "shadow" first parameter, which is
--  /// a pointer to the aggregate, of type PtrArgTy.  If RetPtr is set to true,
--  /// the pointer argument itself is returned from the function.
--  virtual void HandleAggregateShadowResult(const PointerType * /*PtrArgTy*/,
--                                           bool /*RetPtr*/) {}
--
--  /// HandleScalarShadowResult - This callback is invoked if the function
--  /// returns a scalar value by using a "shadow" first parameter, which is a
--  /// pointer to the scalar, of type PtrArgTy.  If RetPtr is set to true,
--  /// the pointer argument itself is returned from the function.
--  virtual void HandleScalarShadowResult(const PointerType * /*PtrArgTy*/,
--                                        bool /*RetPtr*/) {}
--
--
--  /// HandleScalarArgument - This is the primary callback that specifies an
--  /// LLVM argument to pass.  It is only used for first class types.
--  /// If RealSize is non Zero then it specifies number of bytes to access
--  /// from LLVMTy.
--  virtual void HandleScalarArgument(const llvm::Type * /*LLVMTy*/,
--                                    tree_node * /*type*/,
--                                    unsigned /*RealSize*/ = 0) {}
--
--  /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer
--  /// (of type PtrTy) to the argument is passed rather than the argument itself.
--  virtual void HandleByInvisibleReferenceArgument(const llvm::Type * /*PtrTy*/,
--                                                  tree_node * /*type*/) {}
--
--  /// HandleByValArgument - This callback is invoked if the aggregate function
--  /// argument is passed by value.
--  virtual void HandleByValArgument(const llvm::Type * /*LLVMTy*/,
--                                   tree_node * /*type*/) {}
--
--  /// HandleFCAArgument - This callback is invoked if the aggregate function
--  /// argument is passed by value as a first class aggregate.
--  virtual void HandleFCAArgument(const llvm::Type * /*LLVMTy*/,
--                                 tree_node * /*type*/) {}
--
--  /// EnterField - Called when we're about the enter the field of a struct
--  /// or union.  FieldNo is the number of the element we are entering in the
--  /// LLVM Struct, StructTy is the LLVM type of the struct we are entering.
--  virtual void EnterField(unsigned /*FieldNo*/,
--                          const llvm::Type * /*StructTy*/) {}
--  virtual void ExitField() {}
--  virtual void HandlePad(const llvm::Type * /*LLVMTy*/) {}
--};
--
--// LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY - A hook to allow
--// special _Complex handling. Return true if X should be returned using
--// multiple value return instruction.
--#ifndef LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY
--#define LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY(X) \
-- false
--#endif
--
--// LLVM_SHOULD_NOT_USE_SHADOW_RETURN - A hook to allow aggregates to be
--// returned in registers.
--#ifndef LLVM_SHOULD_NOT_USE_SHADOW_RETURN
--#define LLVM_SHOULD_NOT_USE_SHADOW_RETURN(X, CC) \
-- false
--#endif
--
--// doNotUseShadowReturn - Return true if the specified GCC type
--// should not be returned using a pointer to struct parameter.
--extern bool doNotUseShadowReturn(tree_node *type, tree_node *fndecl,
--                                 CallingConv::ID CC);
--
--/// isSingleElementStructOrArray - If this is (recursively) a structure with one
--/// field or an array with one element, return the field type, otherwise return
--/// null.  Returns null for complex number types.  If ignoreZeroLength, the
--/// struct (recursively) may include zero-length fields in addition to the
--/// single element that has data.  If rejectFatBitField, and the single element
--/// is a bitfield of a type that's bigger than the struct, return null anyway.
--extern tree_node *isSingleElementStructOrArray(tree_node *type,
--                                               bool ignoreZeroLength,
--                                               bool rejectFatBitfield);
--
--/// isZeroSizedStructOrUnion - Returns true if this is a struct or union
--/// which is zero bits wide.
--extern bool isZeroSizedStructOrUnion(tree_node *type);
--
--// getLLVMScalarTypeForStructReturn - Return LLVM Type if TY can be
--// returned as a scalar, otherwise return NULL. This is the default
--// target independent implementation.
--static inline
--const Type* getLLVMScalarTypeForStructReturn(tree_node *type, unsigned *Offset) {
--  const Type *Ty = ConvertType(type);
--  unsigned Size = getDataLayout().getTypeAllocSize(Ty);
--  *Offset = 0;
--  if (Size == 0)
--    return Type::getVoidTy(getGlobalContext());
--  else if (Size == 1)
--    return Type::getInt8Ty(getGlobalContext());
--  else if (Size == 2)
--    return Type::getInt16Ty(getGlobalContext());
--  else if (Size <= 4)
--    return Type::getInt32Ty(getGlobalContext());
--  else if (Size <= 8)
--    return Type::getInt64Ty(getGlobalContext());
--  else if (Size <= 16)
--    return IntegerType::get(getGlobalContext(), 128);
--  else if (Size <= 32)
--    return IntegerType::get(getGlobalContext(), 256);
--
--  return NULL;
--}
--
--// getLLVMAggregateTypeForStructReturn - Return LLVM type if TY can be
--// returns as multiple values, otherwise return NULL. This is the default
--// target independent implementation.
--static inline
--const Type* getLLVMAggregateTypeForStructReturn(tree_node * /*type*/) {
--  return NULL;
--}
--
--#ifndef LLVM_TRY_PASS_AGGREGATE_CUSTOM
--#define LLVM_TRY_PASS_AGGREGATE_CUSTOM(T, E, CC, C) \
--  false
--#endif
--
--// LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS - Return true if this vector
--// type should be passed as integer registers.  Generally vectors which are
--// not part of the target architecture should do this.
--#ifndef LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS
--#define LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(TY) \
--  false
--#endif
--
--// LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR - Return true if this vector
--// type should be passed byval.  Used for generic vectors on x86-64.
--#ifndef LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR
--#define LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(X) \
--  false
--#endif
--
--// LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR - Return true if this aggregate
--// value should be passed by value, i.e. passing its address with the byval
--// attribute bit set. The default is false.
--#ifndef LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR
--#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY) \
--    false
--#endif
--
--// LLVM_SHOULD_PASS_AGGREGATE_AS_FCA - Return true if this aggregate value
--// should be passed by value as a first class aggregate. The default is false.
--#ifndef LLVM_SHOULD_PASS_AGGREGATE_AS_FCA
--#define LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(X, TY) \
--    false
--#endif
--
--// LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS - Return true if this aggregate
--// value should be passed in a mixture of integer, floating point, and vector
--// registers. The routine should also return by reference a vector of the
--// types of the registers being used. The default is false.
--#ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS
--#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E) \
--    false
--#endif
--
--// LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS - Only called if
--// LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS returns true. This returns true if
--// there are only enough unused argument passing registers to pass a part of
--// the aggregate. Note, this routine should return false if none of the needed
--// registers are available.
--#ifndef LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS
--#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC) \
--    false
--#endif
--
--// LLVM_BYVAL_ALIGNMENT - Returns the alignment of the type in bytes, if known,
--// in the getGlobalContext() of its use as a function parameter.
--// Note that the alignment in the TYPE node is usually the alignment appropriate
--// when the type is used within a struct, which may or may not be appropriate
--// here.
--#ifndef LLVM_BYVAL_ALIGNMENT
--#define LLVM_BYVAL_ALIGNMENT(T)  0
--#endif
--
--// LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS - Return true if this aggregate
--// value should be passed in integer registers.  By default, we do this for all
--// values that are not single-element structs.  This ensures that things like
--// {short,short} are passed in one 32-bit chunk, not as two arguments (which
--// would often be 64-bits).  We also do it for single-element structs when the
--// single element is a bitfield of a type bigger than the struct; the code
--// for field-by-field struct passing does not handle this one right.
--#ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS
--#define LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(X, Y, Z) \
--   !isSingleElementStructOrArray((X), false, true)
--#endif
--
--// LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR - Return a TYPE tree if this single
--// element struct should be returned using the convention for that scalar TYPE,
--// 0 otherwise.
--// The returned TYPE must be the same size as X for this to work; that is
--// checked elsewhere.  (Structs where this is not the case can be constructed
--// by abusing the __aligned__ attribute.)
--#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR
--#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \
--  isSingleElementStructOrArray(X, false, false)
--#endif
--
--// LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR - Return a TYPE tree if this vector type
--// should be returned using the convention for that scalar TYPE, 0 otherwise.
--// X may be evaluated more than once.
--#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR
--#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X,Y) 0
--#endif
--
--// LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW - Return true if this vector type
--// should be returned using the aggregate shadow (sret) convention, 0 otherwise.
--// X may be evaluated more than once.
--#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW
--#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X,Y) 0
--#endif
--
--// LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
--// returned as a scalar, otherwise return NULL.
--#ifndef LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN
--#define LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN(X, Y) \
--  getLLVMScalarTypeForStructReturn((X), (Y))
--#endif
--
--// LLVM_AGGR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
--// returned as an aggregate, otherwise return NULL.
--#ifndef LLVM_AGGR_TYPE_FOR_STRUCT_RETURN
--#define LLVM_AGGR_TYPE_FOR_STRUCT_RETURN(X, CC)    \
--  getLLVMAggregateTypeForStructReturn(X)
--#endif
--
--// LLVM_EXTRACT_MULTIPLE_RETURN_VALUE - Extract multiple return value from
--// SRC and assign it to DEST. Each target that supports multiple return
--// value must implement this hook.
--#ifndef LLVM_EXTRACT_MULTIPLE_RETURN_VALUE
--#define LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,V,B)     \
--  llvm_default_extract_multiple_return_value((Src),(Dest),(V),(B))
--#endif
--static inline
--void llvm_default_extract_multiple_return_value(Value * /*Src*/, Value * /*Dest*/,
--                                                bool /*isVolatile*/,
--                                                LLVMBuilder &/*Builder*/) {
--  assert (0 && "LLVM_EXTRACT_MULTIPLE_RETURN_VALUE is not implemented!");
--}
--
--/// DefaultABI - This class implements the default LLVM ABI where structures are
--/// passed by decimating them into individual components and unions are passed
--/// by passing the largest member of the union.
--///
--class DefaultABI {
--protected:
--  DefaultABIClient &C;
--public:
--  DefaultABI(DefaultABIClient &c);
--
--  bool isShadowReturn() const;
--
--  /// HandleReturnType - This is invoked by the target-independent code for the
--  /// return type. It potentially breaks down the argument and invokes methods
--  /// on the client that indicate how its pieces should be handled.  This
--  /// handles things like returning structures via hidden parameters.
--  void HandleReturnType(tree_node *type, tree_node *fn, bool isBuiltin);
--
--  /// HandleArgument - This is invoked by the target-independent code for each
--  /// argument type passed into the function.  It potentially breaks down the
--  /// argument and invokes methods on the client that indicate how its pieces
--  /// should be handled.  This handles things like decimating structures into
--  /// their fields.
--  void HandleArgument(tree_node *type, std::vector<const Type*> &ScalarElts,
--                      Attributes *Attributes = NULL);
--
--  /// HandleUnion - Handle a UNION_TYPE or QUAL_UNION_TYPE tree.
--  ///
--  void HandleUnion(tree_node *type, std::vector<const Type*> &ScalarElts);
--
--  /// PassInIntegerRegisters - Given an aggregate value that should be passed in
--  /// integer registers, convert it to a structure containing ints and pass all
--  /// of the struct elements in.  If Size is set we pass only that many bytes.
--  void PassInIntegerRegisters(tree_node *type,
--                              std::vector<const Type*> &ScalarElts,
--                              unsigned origSize, bool DontCheckAlignment);
--
--  /// PassInMixedRegisters - Given an aggregate value that should be passed in
--  /// mixed integer, floating point, and vector registers, convert it to a
--  /// structure containing the specified struct elements in.
--  void PassInMixedRegisters(const Type *Ty, std::vector<const Type*> &OrigElts,
--                            std::vector<const Type*> &ScalarElts);
--};
--
--#endif /* DRAGONEGG_ABI_H */
-diff -r -u -N dragonegg-2.9-old/ADT/IntervalList.h dragonegg-2.9-new/ADT/IntervalList.h
---- dragonegg-2.9-old/ADT/IntervalList.h	2011-03-28 21:44:58.000000000 +0200
-+++ dragonegg-2.9-new/ADT/IntervalList.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,215 +0,0 @@
--//=--------- IntervalList.h - List of disjoint intervals ----------*- C++ -*-=//
--//
--// Copyright (C) 2011  Duncan Sands.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares a utility class for maintaining a collection of pairwise
--// disjoint intervals.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_INTERVALLIST_H
--#define DRAGONEGG_INTERVALLIST_H
--
--#include "Range.h"
--#include "llvm/ADT/SmallVector.h"
--
--/// IntervalList - Maintains a list of disjoint intervals.  Type 'T' represents
--/// an interval, and should have a getRange method which returns a range of 'U'
--/// values.  In addition it should provide ChangeRangeTo for growing, shrinking
--/// and otherwise changing the shape of the interval; and JoinWith for replacing
--/// the interval with the convex hull of its union with another interval (which
--/// is guaranteed to be disjoint from the original).
--template <class T, typename U, unsigned N>
--class IntervalList {
--  typedef typename llvm::SmallVector<T, N> List;
--  typedef typename List::iterator iterator;
--
--  List Intervals;
--  // The actual intervals.  Always disjoint, sorted and non-empty.
--
--  /// CmpFirst - Compare intervals based on where they start.
--  static bool CmpFirst(const T &L, const T &R) {
--    return L.getRange().getFirst() < R.getRange().getFirst();
--  }
--
--  /// CmpLast - Compare intervals based on where they stop.
--  static bool CmpLast(const T &L, const T &R) {
--    return L.getRange().getLast() < R.getRange().getLast();
--  }
--
--  /// isSane - Return true if the intervals are non-empty, disjoint and
--  /// sorted.
--  bool isSane() const {
--    for (unsigned i = 0, e = Intervals.size(); i < e; ++i) {
--      if (Intervals[i].getRange().empty())
--        return false;
--      if (i && Intervals[i].getRange().getFirst() <
--          Intervals[i-1].getRange().getLast())
--        return false;
--    }
--    return true;
--  }
--
--public:
--
--  /// AddInterval - Add the given interval to the list.  If it overlaps any
--  /// existing intervals then the existing intervals are pruned by removing
--  /// exactly the parts of them that overlap the new interval.  If the added
--  /// interval is empty then it will be discarded.
--  void AddInterval(const T &S);
--
--  /// getNumIntervals - Return the number of intervals in the list.
--  unsigned getNumIntervals() const {
--    return Intervals.size();
--  }
--
--  /// getInterval - Return the interval with the given index.
--  T getInterval(unsigned Idx) {
--    return Intervals[Idx];
--  }
--
--  /// AlignBoundaries - Ensure that all intervals begin and end on a multiple of
--  /// the given value.
--  void AlignBoundaries(unsigned Alignment);
--};
--
--/// AddInterval - Add the given interval to the list.  If it overlaps any
--/// existing intervals then the existing intervals are pruned by removing
--/// exactly the parts of them that overlap the new interval.  If the added
--/// interval is empty then it will be discarded.
--template <class T, typename U, unsigned N>
--void IntervalList<T, U, N>::AddInterval(const T &Interval) {
--  const Range<U> NewRange = Interval.getRange();
--
--  // If the new interval is empty then there is no point in adding it.
--  if (NewRange.empty())
--    return;
--
--  // If this is the first interval then it cannot overlap any others.
--  if (Intervals.empty()) {
--    Intervals.push_back(Interval);
--    return;
--  }
--
--  // Check for overlap with existing intervals.
--  iterator Lo = std::lower_bound(Intervals.begin(), Intervals.end(), Interval,
--                                 CmpFirst);
--  iterator Hi = std::upper_bound(Intervals.begin(), Intervals.end(), Interval,
--                                 CmpLast);
--  if (Lo < Hi) {
--    // Intervals with index in [Lo, Hi) are those completely covered by the new
--    // interval.  Throw them away.
--    for (iterator I = Lo; I != Hi; ++I)
--      assert(NewRange.contains(I->getRange()) && "Old interval not covered!");
--    Intervals.erase(Lo, Hi);
--    Hi = Lo;
--  } else if (Hi < Lo) {
--    // The new interval is contained in Hi with an excedent at each end.  Chop
--    // the old interval into two pieces (the lower and upper parts) and insert
--    // the new interval between them.
--    const Range<U> OldRange = Hi->getRange();
--    assert(OldRange.contains(NewRange) && "New interval not contained in old!");
--    const Range<U> LowerRange(OldRange.getFirst(), NewRange.getFirst());
--    const Range<U> UpperRange(NewRange.getLast(), OldRange.getLast());
--    assert(!LowerRange.empty() && !UpperRange.empty() && "Degenerate end!");
--    T UpperPart = *Hi;
--    Hi->ChangeRangeTo(LowerRange);
--    UpperPart.ChangeRangeTo(UpperRange);
--    Lo = Intervals.insert(Lo, UpperPart);
--    Intervals.insert(Lo, Interval);
--    assert(isSane() && "Interval added wrong!");
--    return;
--  }
--  assert(Lo == Hi);
--  // Check for overlap with the preceding interval.
--  if (Lo != Intervals.begin()) {
--    const iterator Prev = Lo - 1;
--    const Range<U> PrevRange = Prev->getRange();
--    if (NewRange.getFirst() < PrevRange.getLast())
--      // Shrink the previous interval to remove the overlap.
--      Prev->ChangeRangeTo(Range<U>(PrevRange.getFirst(), NewRange.getFirst()));
--  }
--  // Check for overlap with the following interval.
--  if (Lo != Intervals.end()) {
--    const iterator Next = Lo;
--    const Range<U> NextRange = Next->getRange();
--    if (NextRange.getFirst() < NewRange.getLast())
--      // Shrink the next interval to remove the overlap.
--      Next->ChangeRangeTo(Range<U>(NewRange.getLast(), NextRange.getLast()));
--  }
--  // The new interval is now disjoint from any existing intervals.  Insert it.
--  Intervals.insert(Lo, Interval);
--  assert(isSane() && "Interval added wrong!");
--}
--
--/// AlignBoundaries - Ensure that all intervals begin and end on a multiple of
--/// the given value.
--template <class T, typename U, unsigned N>
--void IntervalList<T, U, N>::AlignBoundaries(unsigned Alignment) {
--  assert(Alignment > 0 && "Alignment should be positive!");
--  for (iterator SI = Intervals.begin(); SI != Intervals.end(); ++SI) {
--    T &Interval = *SI;
--    Range<U> OrigRange = Interval.getRange();
--
--    // Round the start of the interval down and the end of the interval up to
--    // the nearest multiple of the alignment.
--    U RoundedFirst = OrigRange.getFirst() - (OrigRange.getFirst() % Alignment);
--    U RoundedLast = OrigRange.getLast() + Alignment - 1;
--    RoundedLast -= RoundedLast % Alignment;
--    Range<U> AlignedRange(RoundedFirst, RoundedLast);
--
--    // There is nothing to do if the interval is already aligned.
--    if (OrigRange == AlignedRange)
--      continue;
--
--    // Merge in all following intervals that start before RoundedLast.
--    iterator Next = SI + 1;
--    for (; Next != Intervals.end() && Next->getRange().getFirst() < RoundedLast;
--         ++Next)
--      Interval.JoinWith(*Next);
--    assert(Interval.getRange().getFirst() == OrigRange.getFirst() &&
--           "Merging at end changed start!");
--
--    // If merging caused the interval to extend beyond RoundedLast then chop the
--    // interval in two at RoundedLast.  This stops intervals getting huge due to
--    // repeated merging.
--    if (Interval.getRange().getLast() > RoundedLast) {
--      Range<U> LowerR(OrigRange.getFirst(), RoundedLast);
--      Range<U> UpperR(RoundedLast, Interval.getRange().getLast());
--      // We must have merged in at least the next interval.  Reuse it to hold
--      // the part we chop off the end.
--      T &J = *(SI + 1) = Interval;
--      // Chop the end off the original interval so that it stops at RoundedLast
--      // and at the same time extend the start of the original interval down to
--      // the alignment boundary.
--      Interval.ChangeRangeTo(AlignedRange);
--      // Chop the start off the new (following) interval so that it begins at
--      // RoundedLast.
--      J.ChangeRangeTo(UpperR);
--      // Delete any other merged intervals.
--      Intervals.erase(SI + 2, Next);
--    } else {
--      // The interval didn't grow beyond the original alignment boundary.  Round
--      // it to those boundaries.
--      Interval.ChangeRangeTo(AlignedRange);
--      // Delete any merged intervals.
--      Intervals.erase(SI + 1, Next);
--    }
--  }
--}
--
--#endif /* DRAGONEGG_INTERVALLIST_H */
-diff -r -u -N dragonegg-2.9-old/ADT/Range.h dragonegg-2.9-new/ADT/Range.h
---- dragonegg-2.9-old/ADT/Range.h	2011-03-28 21:44:58.000000000 +0200
-+++ dragonegg-2.9-new/ADT/Range.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,106 +0,0 @@
--//=------------------ Range.h - Interval of values ----------------*- C++ -*-=//
--//
--// Copyright (C) 2011  Duncan Sands.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares a utility class for representing an interval of values.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_RANGE_H
--#define DRAGONEGG_RANGE_H
--
--/// Range - Represents the interval [First, Last).
--template<typename T>
--class Range {
--  T First, Last;
--public:
--  Range() : First(0), Last(0) {}
--  Range(T first, T last) : First(first), Last(last) {}
--
--  bool operator==(const Range &other) const {
--    return (empty() && other.empty()) ||
--      (First == other.First && Last == other.Last);
--  }
--
--  /// empty - Return whether the range is empty.
--  bool empty() const {
--    return Last <= First;
--  }
--
--  /// getFirst - Return the value defining the start of the range.
--  T getFirst() const {
--    assert(!empty() && "An empty range has no starting value!");
--    return First;
--  }
--
--  /// getLast - Return the value defining the end of the range.
--  T getLast() const {
--    assert(!empty() && "An empty range has no ending value!");
--    return Last;
--  }
--
--  /// getWidth - Return the number of values in the range.
--  T getWidth() const {
--    return empty() ? 0 : Last - First;
--  }
--
--  /// contains - Return true if the given range is contained in this one.
--  bool contains(Range r) const {
--    if (r.empty())
--      return true;
--    if (empty())
--      return false;
--    return First <= r.First && Last >= r.Last;
--  }
--
--  /// intersects - Return true if the given range intersects this one.
--  bool intersects(Range r) const {
--    if (empty() || r.empty())
--      return false;
--    return r.First < Last && r.Last > First;
--  }
--
--  /// Displace - Return the range obtained by adding the given offset.
--  Range Displace(T Offset) const {
--    if (empty())
--      return Range();
--    assert(((Offset >= 0 && First + Offset >= First && Last + Offset >= Last) ||
--            (Offset < 0 && First + Offset < First && Last + Offset < Last)) &&
--           "Displacement wrapped range!");
--    return Range(First + Offset, Last + Offset);
--  }
--
--  /// Join - Return the smallest range containing this range and the given one.
--  Range Join(Range other) const {
--    if (empty())
--      return other;
--    if (other.empty())
--      return *this;
--    return Range(First < other.First ? First : other.First,
--                 Last > other.Last ? Last : other.Last);
--  }
--
--  /// Meet - Return the intersection of this range and the given one.
--  Range Meet(Range other) const {
--    if (empty() || other.empty())
--      return Range();
--    return Range(First > other.First ? First : other.First,
--                 Last < other.Last ? Last : other.Last);
--  }
--};
--
--#endif /* DRAGONEGG_RANGE_H */
-diff -r -u -N dragonegg-2.9-old/Backend.cpp dragonegg-2.9-new/Backend.cpp
---- dragonegg-2.9-old/Backend.cpp	2011-03-30 08:30:55.000000000 +0200
-+++ dragonegg-2.9-new/Backend.cpp	2011-04-09 00:38:06.620098051 +0200
-@@ -23,12 +23,12 @@
- 
- // Plugin headers
- extern "C" {
--#include "cache.h"
-+#include "dragonegg/cache.h"
- }
--#include "Constants.h"
--#include "Debug.h"
--#include "OS.h"
--#include "Target.h"
-+#include "dragonegg/Constants.h"
-+#include "dragonegg/Debug.h"
-+#include "dragonegg/OS.h"
-+#include "dragonegg/Target.h"
- 
- // LLVM headers
- #define DEBUG_TYPE "plugin"
-diff -r -u -N dragonegg-2.9-old/cache.c dragonegg-2.9-new/cache.c
---- dragonegg-2.9-old/cache.c	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/cache.c	2011-04-09 00:38:06.620098051 +0200
-@@ -25,7 +25,7 @@
-   ===----------------------------------------------------------------------===*/
- 
- /* Plugin headers.  */
--#include "cache.h"
-+#include "dragonegg/cache.h"
- 
- /* GCC headers.  */
- #include "config.h"
-@@ -49,7 +49,7 @@
-   htab_t llvm_cache;
- 
- /* Garbage collector header.  */
--#include "gt-cache.h"
-+#include "dragonegg/gt-cache.h"
- 
- /* llvm_has_cached - Returns whether a value has been associated with the
-    tree.  */
-diff -r -u -N dragonegg-2.9-old/cache.h dragonegg-2.9-new/cache.h
---- dragonegg-2.9-old/cache.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/cache.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,45 +0,0 @@
--/*===----------- cache.h - Caching values "in" GCC trees ----------*- C -*-===*\
--|*                                                                            *|
--|* Copyright (C) 2009, 2010, 2011  Duncan Sands.                              *|
--|*                                                                            *|
--|* This file is part of DragonEgg.                                            *|
--|*                                                                            *|
--|* DragonEgg is free software; you can redistribute it and/or modify it under *|
--|* the terms of the GNU General Public License as published by the Free       *|
--|* Software Foundation; either version 2, or (at your option) any later       *|
--|* version.                                                                   *|
--|*                                                                            *|
--|* DragonEgg is distributed in the hope that it will be useful, but WITHOUT   *|
--|* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or      *|
--|* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  *|
--|* more details.                                                              *|
--|* You should have received a copy of the GNU General Public License along    *|
--|* with DragonEgg; see the file COPYING.  If not, write to the Free Software  *|
--|* Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.     *|
--|*                                                                            *|
--|*===----------------------------------------------------------------------===*|
--|* This code lets you to associate a void* with a tree, as if it were cached  *|
--|* inside the tree: if the tree is garbage collected and reallocated, then    *|
--|* the cached value will have been cleared.                                   *|
--\*===----------------------------------------------------------------------===*/
--
--#ifndef DRAGONEGG_CACHE_H
--#define DRAGONEGG_CACHE_H
--
--union tree_node;
--
--/* llvm_has_cached - Returns whether a value has been associated with the
--   tree.  */
--extern int llvm_has_cached(union tree_node *tree);
--
--/* llvm_get_cached - Returns the value associated with the tree, or NULL.  */
--extern const void *llvm_get_cached(union tree_node *tree);
--
--/* llvm_set_cached - Associates the given value with the tree (and returns it).
--   To delete an association, pass NULL for the value.  */
--extern const void *llvm_set_cached(union tree_node *tree, const void *val);
--
--/* llvm_replace_cached - Replaces all occurrences of old_val with new_val.  */
--extern void llvm_replace_cached(const void *old_val, const void *new_val);
--
--#endif /* DRAGONEGG_CACHE_H */
-diff -r -u -N dragonegg-2.9-old/Constants.cpp dragonegg-2.9-new/Constants.cpp
---- dragonegg-2.9-old/Constants.cpp	2011-03-31 17:57:30.000000000 +0200
-+++ dragonegg-2.9-new/Constants.cpp	2011-04-09 00:38:06.620098051 +0200
-@@ -21,11 +21,11 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "Constants.h"
--#include "Internals.h"
--#include "Trees.h"
--#include "ADT/IntervalList.h"
--#include "ADT/Range.h"
-+#include "dragonegg/Constants.h"
-+#include "dragonegg/Internals.h"
-+#include "dragonegg/Trees.h"
-+#include "dragonegg/ADT/IntervalList.h"
-+#include "dragonegg/ADT/Range.h"
- 
- // LLVM headers
- #include "llvm/GlobalVariable.h"
-diff -r -u -N dragonegg-2.9-old/Constants.h dragonegg-2.9-new/Constants.h
---- dragonegg-2.9-old/Constants.h	2011-03-29 20:44:32.000000000 +0200
-+++ dragonegg-2.9-new/Constants.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,60 +0,0 @@
--//=----- Constants.h - Converting and working with constants ------*- C++ -*-=//
--//
--// Copyright (C) 2011  Duncan Sands.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares functions for converting GCC constants to LLVM and working
--// with them.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_CONSTANTS_H
--#define DRAGONEGG_CONSTANTS_H
--
--// Forward declarations.
--namespace llvm {
--  class Constant;
--  class Type;
--}
--union tree_node;
--
--/// AddressOf - Given an expression with a constant address such as a constant,
--/// a global variable or a label, returns the address.  The type of the returned
--/// is always a pointer type and, as long as 'exp' does not have void type, the
--/// type of the pointee is the memory type that corresponds to the type of exp
--/// (see ConvertType).
--extern llvm::Constant *AddressOf(tree_node *exp);
--
--/// ConvertInitializer - Convert the initial value for a global variable to an
--/// equivalent LLVM constant.  Also handles constant constructors.  The type of
--/// the returned value may be pretty much anything.  All that is guaranteed is
--/// that its alloc size is equal to the size of the initial value and that its
--/// alignment is less than or equal to the initial value's GCC type alignment.
--/// Note that the GCC type may have variable size or no size, in which case the
--/// size is determined by the initial value.  When this happens the size of the
--/// initial value may exceed the alloc size of the LLVM memory type generated
--/// for the GCC type (see ConvertType); it is never smaller than the alloc size.
--extern llvm::Constant *ConvertInitializer(tree_node *exp);
--
--/// InterpretAsType - Interpret the bits of the given constant (starting from
--/// StartingBit) as representing a constant of type 'Ty'.  This results in the
--/// same constant as you would get by storing the bits of 'C' to memory (with
--/// the first bit stored being 'StartingBit') and then loading out a (constant)
--/// value of type 'Ty' from the stored to memory location.
--extern llvm::Constant *InterpretAsType(llvm::Constant *C, const llvm::Type* Ty,
--                                       int StartingBit);
--
--#endif /* DRAGONEGG_CONSTANTS_H */
-diff -r -u -N dragonegg-2.9-old/Convert.cpp dragonegg-2.9-new/Convert.cpp
---- dragonegg-2.9-old/Convert.cpp	2011-03-31 17:59:19.000000000 +0200
-+++ dragonegg-2.9-new/Convert.cpp	2011-04-09 00:38:06.620098051 +0200
-@@ -22,10 +22,10 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "ABI.h"
--#include "Constants.h"
--#include "Debug.h"
--#include "Trees.h"
-+#include "dragonegg/ABI.h"
-+#include "dragonegg/Constants.h"
-+#include "dragonegg/Debug.h"
-+#include "dragonegg/Trees.h"
- 
- // LLVM headers
- #include "llvm/Module.h"
-diff -r -u -N dragonegg-2.9-old/darwin/dragonegg/OS.h dragonegg-2.9-new/darwin/dragonegg/OS.h
---- dragonegg-2.9-old/darwin/dragonegg/OS.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/darwin/dragonegg/OS.h	2011-04-09 00:38:06.620098051 +0200
-@@ -0,0 +1,56 @@
-+//===------------ OS.h - Darwin specific definitions ------------*- C++ -*-===//
-+//
-+// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file provides Darwin specific declarations.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_OS_H
-+#define DRAGONEGG_OS_H
-+
-+/* Darwin X86-64 only supports PIC code generation. */
-+#if defined (TARGET_386)
-+#define LLVM_SET_TARGET_OPTIONS(argvec)              \
-+  if ((TARGET_64BIT) || flag_pic)                    \
-+    argvec.push_back ("--relocation-model=pic");     \
-+  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
-+    argvec.push_back ("--relocation-model=static")
-+#elif defined (TARGET_ARM)
-+#define LLVM_SET_TARGET_OPTIONS(argvec)              \
-+  if (flag_pic)                                      \
-+    argvec.push_back ("--relocation-model=pic");     \
-+  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
-+    argvec.push_back ("--relocation-model=static");  \
-+#else /* !TARGET_386 && !TARGET_ARM */
-+#define LLVM_SET_TARGET_OPTIONS(argvec)              \
-+  if (flag_pic)                                      \
-+    argvec.push_back ("--relocation-model=pic");     \
-+  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
-+    argvec.push_back ("--relocation-model=static")
-+#endif /* !TARGET_386 && !TARGET_ARM */
-+
-+/* Give a constant string a sufficient alignment for the platform.  */
-+/* radar 7291825 */
-+#define TARGET_ADJUST_CSTRING_ALIGN(GV)                                 \
-+  do {                                                                  \
-+    if (GV->hasInternalLinkage()) {                                     \
-+      GV->setAlignment(TARGET_64BIT ? 8 : 4);                           \
-+    }                                                                   \
-+  } while (0)
-+
-+#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/darwin/OS.h dragonegg-2.9-new/darwin/OS.h
---- dragonegg-2.9-old/darwin/OS.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/darwin/OS.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,56 +0,0 @@
--//===------------ OS.h - Darwin specific definitions ------------*- C++ -*-===//
--//
--// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file provides Darwin specific declarations.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_OS_H
--#define DRAGONEGG_OS_H
--
--/* Darwin X86-64 only supports PIC code generation. */
--#if defined (TARGET_386)
--#define LLVM_SET_TARGET_OPTIONS(argvec)              \
--  if ((TARGET_64BIT) || flag_pic)                    \
--    argvec.push_back ("--relocation-model=pic");     \
--  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
--    argvec.push_back ("--relocation-model=static")
--#elif defined (TARGET_ARM)
--#define LLVM_SET_TARGET_OPTIONS(argvec)              \
--  if (flag_pic)                                      \
--    argvec.push_back ("--relocation-model=pic");     \
--  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
--    argvec.push_back ("--relocation-model=static");  \
--#else /* !TARGET_386 && !TARGET_ARM */
--#define LLVM_SET_TARGET_OPTIONS(argvec)              \
--  if (flag_pic)                                      \
--    argvec.push_back ("--relocation-model=pic");     \
--  else if (!MACHO_DYNAMIC_NO_PIC_P)                  \
--    argvec.push_back ("--relocation-model=static")
--#endif /* !TARGET_386 && !TARGET_ARM */
--
--/* Give a constant string a sufficient alignment for the platform.  */
--/* radar 7291825 */
--#define TARGET_ADJUST_CSTRING_ALIGN(GV)                                 \
--  do {                                                                  \
--    if (GV->hasInternalLinkage()) {                                     \
--      GV->setAlignment(TARGET_64BIT ? 8 : 4);                           \
--    }                                                                   \
--  } while (0)
--
--#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/Debug.cpp dragonegg-2.9-new/Debug.cpp
---- dragonegg-2.9-old/Debug.cpp	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/Debug.cpp	2011-04-09 00:38:06.620098051 +0200
-@@ -22,7 +22,7 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "Debug.h"
-+#include "dragonegg/Debug.h"
- 
- // LLVM headers
- #include "llvm/Module.h"
-diff -r -u -N dragonegg-2.9-old/Debug.h dragonegg-2.9-new/Debug.h
---- dragonegg-2.9-old/Debug.h	2011-03-29 12:46:17.000000000 +0200
-+++ dragonegg-2.9-new/Debug.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,367 +0,0 @@
--//===------ Debug.h - Interface for generating debug info -------*- C++ -*-===//
--//
--// Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011  Jim Laskey, Duncan Sands
--// et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares the debug interfaces shared among the dragonegg files.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_DEBUG_H
--#define DRAGONEGG_DEBUG_H
--
--// Plugin headers
--#include "Internals.h"
--
--// LLVM headers
--#include "llvm/Analysis/DebugInfo.h"
--#include "llvm/Support/Allocator.h"
--#include "llvm/Support/ValueHandle.h"
--
--// System headers
--#include <map>
--
--namespace llvm {
--
--// Forward declarations
--class AllocaInst;
--class BasicBlock;
--class CallInst;
--class Function;
--class Module;
--
--/// DIFactory - This object assists with the construction of the various
--/// descriptors.
--class DIFactory {
--  Module &M;
--  LLVMContext& VMContext;
--  
--  Function *DeclareFn;     // llvm.dbg.declare
--  Function *ValueFn;       // llvm.dbg.value
--  
--  DIFactory(const DIFactory &);     // DO NOT IMPLEMENT
--  void operator=(const DIFactory&); // DO NOT IMPLEMENT
--  public:
--  enum ComplexAddrKind { OpPlus=1, OpDeref };
--  
--  explicit DIFactory(Module &m);
--  
--  /// GetOrCreateArray - Create an descriptor for an array of descriptors.
--  /// This implicitly uniques the arrays created.
--  DIArray GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys);
--  
--  /// GetOrCreateSubrange - Create a descriptor for a value range.  This
--  /// implicitly uniques the values returned.
--  DISubrange GetOrCreateSubrange(int64_t Lo, int64_t Hi);
--  
--  /// CreateUnspecifiedParameter - Create unspeicified type descriptor
--  /// for a subroutine type.
--  DIDescriptor CreateUnspecifiedParameter();
--  
--  /// CreateCompileUnit - Create a new descriptor for the specified compile
--  /// unit.
--  DICompileUnit CreateCompileUnit(unsigned LangID,
--                                  StringRef Filename,
--                                  StringRef Directory,
--                                  StringRef Producer,
--                                  bool isMain = false,
--                                  bool isOptimized = false,
--                                  StringRef Flags = "",
--                                  unsigned RunTimeVer = 0);
--  
--  /// CreateFile -  Create a new descriptor for the specified file.
--  DIFile CreateFile(StringRef Filename, StringRef Directory,
--                    DICompileUnit CU);
--  
--  /// CreateEnumerator - Create a single enumerator value.
--  DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val);
--  
--  /// CreateBasicType - Create a basic type like int, float, etc.
--  DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name,
--                              DIFile F, unsigned LineNumber,
--                              uint64_t SizeInBits, uint64_t AlignInBits,
--                              uint64_t OffsetInBits, unsigned Flags,
--                              unsigned Encoding);
--  
--  /// CreateBasicType - Create a basic type like int, float, etc.
--  DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name,
--                                DIFile F, unsigned LineNumber,
--                                Constant *SizeInBits, Constant *AlignInBits,
--                                Constant *OffsetInBits, unsigned Flags,
--                                unsigned Encoding);
--  
--  /// CreateDerivedType - Create a derived type like const qualified type,
--  /// pointer, typedef, etc.
--  DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context,
--                                  StringRef Name,
--                                  DIFile F,
--                                  unsigned LineNumber,
--                                  uint64_t SizeInBits, uint64_t AlignInBits,
--                                  uint64_t OffsetInBits, unsigned Flags,
--                                  DIType DerivedFrom);
--  
--  /// CreateDerivedType - Create a derived type like const qualified type,
--  /// pointer, typedef, etc.
--  DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context,
--                                    StringRef Name,
--                                    DIFile F,
--                                    unsigned LineNumber,
--                                    Constant *SizeInBits, 
--                                    Constant *AlignInBits,
--                                    Constant *OffsetInBits, unsigned Flags,
--                                    DIType DerivedFrom);
--  
--  /// CreateCompositeType - Create a composite type like array, struct, etc.
--  DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context,
--                                      StringRef Name,
--                                      DIFile F,
--                                      unsigned LineNumber,
--                                      uint64_t SizeInBits,
--                                      uint64_t AlignInBits,
--                                      uint64_t OffsetInBits, unsigned Flags,
--                                      DIType DerivedFrom,
--                                      DIArray Elements,
--                                      unsigned RunTimeLang = 0,
--                                      MDNode *ContainingType = 0);
--  
--  /// CreateTemporaryType - Create a temporary forward-declared type.
--  DIType CreateTemporaryType();
--  DIType CreateTemporaryType(DIFile F);
--  
--  /// CreateArtificialType - Create a new DIType with "artificial" flag set.
--  DIType CreateArtificialType(DIType Ty);
--  
--  /// CreateCompositeType - Create a composite type like array, struct, etc.
--  DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context,
--                                        StringRef Name,
--                                        DIFile F,
--                                        unsigned LineNumber,
--                                        Constant *SizeInBits,
--                                        Constant *AlignInBits,
--                                        Constant *OffsetInBits, 
--                                        unsigned Flags,
--                                        DIType DerivedFrom,
--                                        DIArray Elements,
--                                        unsigned RunTimeLang = 0,
--                                        MDNode *ContainingType = 0);
--  
--  /// CreateSubprogram - Create a new descriptor for the specified subprogram.
--  /// See comments in DISubprogram for descriptions of these fields.
--  DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name,
--                                StringRef DisplayName,
--                                StringRef LinkageName,
--                                DIFile F, unsigned LineNo,
--                                DIType Ty, bool isLocalToUnit,
--                                bool isDefinition,
--                                unsigned VK = 0,
--                                unsigned VIndex = 0,
--                                DIType ContainingType = DIType(),
--                                unsigned Flags = 0,
--                                bool isOptimized = false,
--                                Function *Fn = 0);
--  
--  /// CreateSubprogramDefinition - Create new subprogram descriptor for the
--  /// given declaration. 
--  DISubprogram CreateSubprogramDefinition(DISubprogram &SPDeclaration);
--  
--  /// CreateGlobalVariable - Create a new descriptor for the specified global.
--  DIGlobalVariable
--    CreateGlobalVariable(DIDescriptor Context, StringRef Name,
--                         StringRef DisplayName,
--                         StringRef LinkageName,
--                         DIFile F,
--                         unsigned LineNo, DIType Ty, bool isLocalToUnit,
--                         bool isDefinition, llvm::GlobalVariable *GV);
--  
--  /// CreateGlobalVariable - Create a new descriptor for the specified constant.
--  DIGlobalVariable
--    CreateGlobalVariable(DIDescriptor Context, StringRef Name,
--                         StringRef DisplayName,
--                         StringRef LinkageName,
--                         DIFile F,
--                         unsigned LineNo, DIType Ty, bool isLocalToUnit,
--                         bool isDefinition, llvm::Constant *C);
--  
--  /// CreateVariable - Create a new descriptor for the specified variable.
--  DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
--                            StringRef Name,
--                            DIFile F, unsigned LineNo,
--                            DIType Ty, bool AlwaysPreserve = false,
--                            unsigned Flags = 0);
--  
--  /// CreateComplexVariable - Create a new descriptor for the specified
--  /// variable which has a complex address expression for its address.
--  DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context,
--                                   StringRef Name, DIFile F, unsigned LineNo,
--                                   DIType Ty, Value *const *Addr,
--                                   unsigned NumAddr);
--  
--  /// CreateLexicalBlock - This creates a descriptor for a lexical block
--  /// with the specified parent context.
--  DILexicalBlock CreateLexicalBlock(DIDescriptor Context, DIFile F,
--                                    unsigned Line = 0, unsigned Col = 0);
--  
--  /// CreateNameSpace - This creates new descriptor for a namespace
--  /// with the specified parent context.
--  DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name,
--                              DIFile F, unsigned LineNo);
--  
--  /// CreateLocation - Creates a debug info location.
--  DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
--                            DIScope S, DILocation OrigLoc);
--  
--  /// CreateLocation - Creates a debug info location.
--  DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
--                              DIScope S, MDNode *OrigLoc = 0);
--  
--  /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
--  Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
--                             BasicBlock *InsertAtEnd);
--  
--  /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
--  Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
--                             Instruction *InsertBefore);
--  
--  /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
--  Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
--                                       DIVariable D, BasicBlock *InsertAtEnd);
--  
--  /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
--  Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
--                                       DIVariable D, Instruction *InsertBefore);
--  
--  // RecordType - Record DIType in a module such that it is not lost even if
--  // it is not referenced through debug info anchors.
--  void RecordType(DIType T);
--  
--  private:
--  Constant *GetTagConstant(unsigned TAG);
--};
--
--/// DebugInfo - This class gathers all debug information during compilation and
--/// is responsible for emitting to llvm globals or pass directly to the backend.
--class DebugInfo {
--private:
--  Module *M;                            // The current module.
--  DIFactory DebugFactory;
--  const char *CurFullPath;              // Previous location file encountered.
--  int CurLineNo;                        // Previous location line# encountered.
--  const char *PrevFullPath;             // Previous location file encountered.
--  int PrevLineNo;                       // Previous location line# encountered.
--  BasicBlock *PrevBB;                   // Last basic block encountered.
--
--  DICompileUnit TheCU;                  // The compile unit.
--
--  std::map<tree_node *, WeakVH > TypeCache;
--                                        // Cache of previously constructed
--                                        // Types.
--  std::map<tree_node *, WeakVH > SPCache;
--                                        // Cache of previously constructed
--                                        // Subprograms.
--  std::map<tree_node *, WeakVH> NameSpaceCache;
--                                        // Cache of previously constructed name
--                                        // spaces.
--
--  SmallVector<WeakVH, 4> RegionStack;
--                                        // Stack to track declarative scopes.
--
--  std::map<tree_node *, WeakVH> RegionMap;
--
--  /// FunctionNames - This is a storage for function names that are
--  /// constructed on demand. For example, C++ destructors, C++ operators etc..
--  llvm::BumpPtrAllocator FunctionNames;
--
--public:
--  DebugInfo(Module *m);
--
--  /// Initialize - Initialize debug info by creating compile unit for
--  /// main_input_filename. This must be invoked after language dependent
--  /// initialization is done.
--  void Initialize();
--
--  // Accessors.
--  void setLocationFile(const char *FullPath) { CurFullPath = FullPath; }
--  void setLocationLine(int LineNo)           { CurLineNo = LineNo; }
--
--  /// EmitFunctionStart - Constructs the debug code for entering a function -
--  /// "llvm.dbg.func.start."
--  void EmitFunctionStart(tree_node *FnDecl, Function *Fn);
--
--  /// EmitFunctionEnd - Constructs the debug code for exiting a declarative
--  /// region - "llvm.dbg.region.end."
--  void EmitFunctionEnd(bool EndFunction);
--
--  /// EmitDeclare - Constructs the debug code for allocation of a new variable.
--  /// region - "llvm.dbg.declare."
--  void EmitDeclare(tree_node *decl, unsigned Tag, const char *Name,
--                   tree_node *type, Value *AI, LLVMBuilder &Builder);
--
--  /// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of
--  /// source line.
--  void EmitStopPoint(BasicBlock *CurBB, LLVMBuilder &Builder);
--
--  /// EmitGlobalVariable - Emit information about a global variable.
--  ///
--  void EmitGlobalVariable(GlobalVariable *GV, tree_node *decl);
--
--  /// getOrCreateType - Get the type from the cache or create a new type if
--  /// necessary.
--  DIType getOrCreateType(tree_node *type);
--
--  /// createBasicType - Create BasicType.
--  DIType createBasicType(tree_node *type);
--
--  /// createMethodType - Create MethodType.
--  DIType createMethodType(tree_node *type);
--
--  /// createPointerType - Create PointerType.
--  DIType createPointerType(tree_node *type);
--
--  /// createArrayType - Create ArrayType.
--  DIType createArrayType(tree_node *type);
--
--  /// createEnumType - Create EnumType.
--  DIType createEnumType(tree_node *type);
--
--  /// createStructType - Create StructType for struct or union or class.
--  DIType createStructType(tree_node *type);
--
--  /// createVarinatType - Create variant type or return MainTy.
--  DIType createVariantType(tree_node *type, DIType MainTy);
--
--  /// getOrCreateCompileUnit - Create a new compile unit.
--  DICompileUnit getOrCreateCompileUnit(const char *FullPath,
--                                       bool isMain = false);
--
--  /// getOrCreateFile - Get DIFile descriptor.
--  DIFile getOrCreateFile(const char *FullPath);
--
--  /// findRegion - Find tree_node N's region.
--  DIDescriptor findRegion(tree_node *n);
--
--  /// getOrCreateNameSpace - Get name space descriptor for the tree node.
--  DINameSpace getOrCreateNameSpace(tree_node *Node, DIDescriptor Context);
--
--  /// getFunctionName - Get function name for the given FnDecl. If the
--  /// name is constructred on demand (e.g. C++ destructor) then the name
--  /// is stored on the side.
--  StringRef getFunctionName(tree_node *FnDecl);
--};
--
--} // end namespace llvm
--
--#endif /* DRAGONEGG_DEBUG_H */
-diff -r -u -N dragonegg-2.9-old/DefaultABI.cpp dragonegg-2.9-new/DefaultABI.cpp
---- dragonegg-2.9-old/DefaultABI.cpp	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/DefaultABI.cpp	2011-04-09 00:38:06.620098051 +0200
-@@ -21,7 +21,7 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "ABI.h"
-+#include "dragonegg/ABI.h"
- 
- // System headers
- #include <gmp.h>
-diff -r -u -N dragonegg-2.9-old/freebsd/dragonegg/OS.h dragonegg-2.9-new/freebsd/dragonegg/OS.h
---- dragonegg-2.9-old/freebsd/dragonegg/OS.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/freebsd/dragonegg/OS.h	2011-04-09 00:38:06.620098051 +0200
-@@ -0,0 +1,33 @@
-+//===------------ OS.h - FreeBSD specific definitions -----------*- C++ -*-===//
-+//
-+// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file provides FreeBSD specific declarations.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_OS_H
-+#define DRAGONEGG_OS_H
-+
-+/* Yes, we support PIC codegen for FreeBSD targets! */
-+#define LLVM_SET_TARGET_OPTIONS(argvec)              \
-+  if (flag_pic)                                      \
-+    argvec.push_back ("--relocation-model=pic");     \
-+  else                                               \
-+    argvec.push_back ("--relocation-model=static");
-+
-+#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/freebsd/OS.h dragonegg-2.9-new/freebsd/OS.h
---- dragonegg-2.9-old/freebsd/OS.h	2011-03-28 17:04:33.000000000 +0200
-+++ dragonegg-2.9-new/freebsd/OS.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,33 +0,0 @@
--//===------------ OS.h - FreeBSD specific definitions -----------*- C++ -*-===//
--//
--// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file provides FreeBSD specific declarations.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_OS_H
--#define DRAGONEGG_OS_H
--
--/* Yes, we support PIC codegen for FreeBSD targets! */
--#define LLVM_SET_TARGET_OPTIONS(argvec)              \
--  if (flag_pic)                                      \
--    argvec.push_back ("--relocation-model=pic");     \
--  else                                               \
--    argvec.push_back ("--relocation-model=static");
--
--#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/gt-cache.h dragonegg-2.9-new/gt-cache.h
---- dragonegg-2.9-old/gt-cache.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/gt-cache.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,802 +0,0 @@
--/* Type information for GCC.
--   Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.
--
--This file is part of GCC.
--
--GCC is free software; you can redistribute it and/or modify it under
--the terms of the GNU General Public License as published by the Free
--Software Foundation; either version 3, or (at your option) any later
--version.
--
--GCC is distributed in the hope that it will be useful, but WITHOUT ANY
--WARRANTY; without even the implied warranty of MERCHANTABILITY or
--FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
--for more details.
--
--You should have received a copy of the GNU General Public License
--along with GCC; see the file COPYING3.  If not see
--<http://www.gnu.org/licenses/>.  */
--
--/* This file is machine generated.  Do not edit.  */
--
--/* GC marker procedures.  */
--/* macros and declarations */
--#define gt_ggc_m_13tree_llvm_map(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_llvm_map (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_llvm_map (void *);
--#define gt_ggc_m_15interface_tuple(X) do { \
--  if (X != NULL) gt_ggc_mx_interface_tuple (X);\
--  } while (0)
--extern void gt_ggc_mx_interface_tuple (void *);
--#define gt_ggc_m_16volatilized_type(X) do { \
--  if (X != NULL) gt_ggc_mx_volatilized_type (X);\
--  } while (0)
--extern void gt_ggc_mx_volatilized_type (void *);
--#define gt_ggc_m_17string_descriptor(X) do { \
--  if (X != NULL) gt_ggc_mx_string_descriptor (X);\
--  } while (0)
--extern void gt_ggc_mx_string_descriptor (void *);
--#define gt_ggc_m_15c_inline_static(X) do { \
--  if (X != NULL) gt_ggc_mx_c_inline_static (X);\
--  } while (0)
--extern void gt_ggc_mx_c_inline_static (void *);
--#define gt_ggc_m_24VEC_c_goto_bindings_p_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_c_goto_bindings_p_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_c_goto_bindings_p_gc (void *);
--#define gt_ggc_m_15c_goto_bindings(X) do { \
--  if (X != NULL) gt_ggc_mx_c_goto_bindings (X);\
--  } while (0)
--extern void gt_ggc_mx_c_goto_bindings (void *);
--#define gt_ggc_m_7c_scope(X) do { \
--  if (X != NULL) gt_ggc_mx_c_scope (X);\
--  } while (0)
--extern void gt_ggc_mx_c_scope (void *);
--#define gt_ggc_m_9c_binding(X) do { \
--  if (X != NULL) gt_ggc_mx_c_binding (X);\
--  } while (0)
--extern void gt_ggc_mx_c_binding (void *);
--#define gt_ggc_m_12c_label_vars(X) do { \
--  if (X != NULL) gt_ggc_mx_c_label_vars (X);\
--  } while (0)
--extern void gt_ggc_mx_c_label_vars (void *);
--#define gt_ggc_m_8c_parser(X) do { \
--  if (X != NULL) gt_ggc_mx_c_parser (X);\
--  } while (0)
--extern void gt_ggc_mx_c_parser (void *);
--#define gt_ggc_m_9imp_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_imp_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_imp_entry (void *);
--#define gt_ggc_m_16hashed_attribute(X) do { \
--  if (X != NULL) gt_ggc_mx_hashed_attribute (X);\
--  } while (0)
--extern void gt_ggc_mx_hashed_attribute (void *);
--#define gt_ggc_m_12hashed_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_hashed_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_hashed_entry (void *);
--#define gt_ggc_m_14type_assertion(X) do { \
--  if (X != NULL) gt_ggc_mx_type_assertion (X);\
--  } while (0)
--extern void gt_ggc_mx_type_assertion (void *);
--#define gt_ggc_m_18treetreehash_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_treetreehash_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_treetreehash_entry (void *);
--#define gt_ggc_m_5CPool(X) do { \
--  if (X != NULL) gt_ggc_mx_CPool (X);\
--  } while (0)
--extern void gt_ggc_mx_CPool (void *);
--#define gt_ggc_m_3JCF(X) do { \
--  if (X != NULL) gt_ggc_mx_JCF (X);\
--  } while (0)
--extern void gt_ggc_mx_JCF (void *);
--#define gt_ggc_m_17module_htab_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_module_htab_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_module_htab_entry (void *);
--#define gt_ggc_m_13binding_level(X) do { \
--  if (X != NULL) gt_ggc_mx_binding_level (X);\
--  } while (0)
--extern void gt_ggc_mx_binding_level (void *);
--#define gt_ggc_m_9opt_stack(X) do { \
--  if (X != NULL) gt_ggc_mx_opt_stack (X);\
--  } while (0)
--extern void gt_ggc_mx_opt_stack (void *);
--#define gt_ggc_m_16def_pragma_macro(X) do { \
--  if (X != NULL) gt_ggc_mx_def_pragma_macro (X);\
--  } while (0)
--extern void gt_ggc_mx_def_pragma_macro (void *);
--#define gt_ggc_m_22def_pragma_macro_value(X) do { \
--  if (X != NULL) gt_ggc_mx_def_pragma_macro_value (X);\
--  } while (0)
--extern void gt_ggc_mx_def_pragma_macro_value (void *);
--#define gt_ggc_m_11align_stack(X) do { \
--  if (X != NULL) gt_ggc_mx_align_stack (X);\
--  } while (0)
--extern void gt_ggc_mx_align_stack (void *);
--#define gt_ggc_m_18VEC_tree_gc_vec_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_tree_gc_vec_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_tree_gc_vec_gc (void *);
--#define gt_ggc_m_19VEC_const_char_p_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_const_char_p_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_const_char_p_gc (void *);
--#define gt_ggc_m_21pending_abstract_type(X) do { \
--  if (X != NULL) gt_ggc_mx_pending_abstract_type (X);\
--  } while (0)
--extern void gt_ggc_mx_pending_abstract_type (void *);
--#define gt_ggc_m_15VEC_tree_int_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_tree_int_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_tree_int_gc (void *);
--#define gt_ggc_m_9cp_parser(X) do { \
--  if (X != NULL) gt_ggc_mx_cp_parser (X);\
--  } while (0)
--extern void gt_ggc_mx_cp_parser (void *);
--#define gt_ggc_m_17cp_parser_context(X) do { \
--  if (X != NULL) gt_ggc_mx_cp_parser_context (X);\
--  } while (0)
--extern void gt_ggc_mx_cp_parser_context (void *);
--#define gt_ggc_m_8cp_lexer(X) do { \
--  if (X != NULL) gt_ggc_mx_cp_lexer (X);\
--  } while (0)
--extern void gt_ggc_mx_cp_lexer (void *);
--#define gt_ggc_m_10tree_check(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_check (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_check (void *);
--#define gt_ggc_m_22VEC_deferred_access_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_deferred_access_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_deferred_access_gc (void *);
--#define gt_ggc_m_10spec_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_spec_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_spec_entry (void *);
--#define gt_ggc_m_16pending_template(X) do { \
--  if (X != NULL) gt_ggc_mx_pending_template (X);\
--  } while (0)
--extern void gt_ggc_mx_pending_template (void *);
--#define gt_ggc_m_21named_label_use_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_named_label_use_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_named_label_use_entry (void *);
--#define gt_ggc_m_28VEC_deferred_access_check_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_deferred_access_check_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_deferred_access_check_gc (void *);
--#define gt_ggc_m_11tinst_level(X) do { \
--  if (X != NULL) gt_ggc_mx_tinst_level (X);\
--  } while (0)
--extern void gt_ggc_mx_tinst_level (void *);
--#define gt_ggc_m_18sorted_fields_type(X) do { \
--  if (X != NULL) gt_ggc_mx_sorted_fields_type (X);\
--  } while (0)
--extern void gt_ggc_mx_sorted_fields_type (void *);
--#define gt_ggc_m_18VEC_tree_pair_s_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_tree_pair_s_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_tree_pair_s_gc (void *);
--#define gt_ggc_m_17named_label_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_named_label_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_named_label_entry (void *);
--#define gt_ggc_m_14cp_token_cache(X) do { \
--  if (X != NULL) gt_ggc_mx_cp_token_cache (X);\
--  } while (0)
--extern void gt_ggc_mx_cp_token_cache (void *);
--#define gt_ggc_m_11saved_scope(X) do { \
--  if (X != NULL) gt_ggc_mx_saved_scope (X);\
--  } while (0)
--extern void gt_ggc_mx_saved_scope (void *);
--#define gt_ggc_m_16cxx_int_tree_map(X) do { \
--  if (X != NULL) gt_ggc_mx_cxx_int_tree_map (X);\
--  } while (0)
--extern void gt_ggc_mx_cxx_int_tree_map (void *);
--#define gt_ggc_m_23VEC_cp_class_binding_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_cp_class_binding_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_cp_class_binding_gc (void *);
--#define gt_ggc_m_24VEC_cxx_saved_binding_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_cxx_saved_binding_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_cxx_saved_binding_gc (void *);
--#define gt_ggc_m_16cp_binding_level(X) do { \
--  if (X != NULL) gt_ggc_mx_cp_binding_level (X);\
--  } while (0)
--extern void gt_ggc_mx_cp_binding_level (void *);
--#define gt_ggc_m_11cxx_binding(X) do { \
--  if (X != NULL) gt_ggc_mx_cxx_binding (X);\
--  } while (0)
--extern void gt_ggc_mx_cxx_binding (void *);
--#define gt_ggc_m_15binding_entry_s(X) do { \
--  if (X != NULL) gt_ggc_mx_binding_entry_s (X);\
--  } while (0)
--extern void gt_ggc_mx_binding_entry_s (void *);
--#define gt_ggc_m_15binding_table_s(X) do { \
--  if (X != NULL) gt_ggc_mx_binding_table_s (X);\
--  } while (0)
--extern void gt_ggc_mx_binding_table_s (void *);
--#define gt_ggc_m_14VEC_tinfo_s_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_tinfo_s_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_tinfo_s_gc (void *);
--#define gt_ggc_m_18gnat_binding_level(X) do { \
--  if (X != NULL) gt_ggc_mx_gnat_binding_level (X);\
--  } while (0)
--extern void gt_ggc_mx_gnat_binding_level (void *);
--#define gt_ggc_m_9elab_info(X) do { \
--  if (X != NULL) gt_ggc_mx_elab_info (X);\
--  } while (0)
--extern void gt_ggc_mx_elab_info (void *);
--#define gt_ggc_m_10stmt_group(X) do { \
--  if (X != NULL) gt_ggc_mx_stmt_group (X);\
--  } while (0)
--extern void gt_ggc_mx_stmt_group (void *);
--#define gt_ggc_m_16VEC_parm_attr_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_parm_attr_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_parm_attr_gc (void *);
--#define gt_ggc_m_11parm_attr_d(X) do { \
--  if (X != NULL) gt_ggc_mx_parm_attr_d (X);\
--  } while (0)
--extern void gt_ggc_mx_parm_attr_d (void *);
--#define gt_ggc_m_22VEC_ipa_edge_args_t_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_ipa_edge_args_t_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_ipa_edge_args_t_gc (void *);
--#define gt_ggc_m_20lto_symtab_entry_def(X) do { \
--  if (X != NULL) gt_ggc_mx_lto_symtab_entry_def (X);\
--  } while (0)
--extern void gt_ggc_mx_lto_symtab_entry_def (void *);
--#define gt_ggc_m_20ssa_operand_memory_d(X) do { \
--  if (X != NULL) gt_ggc_mx_ssa_operand_memory_d (X);\
--  } while (0)
--extern void gt_ggc_mx_ssa_operand_memory_d (void *);
--#define gt_ggc_m_13scev_info_str(X) do { \
--  if (X != NULL) gt_ggc_mx_scev_info_str (X);\
--  } while (0)
--extern void gt_ggc_mx_scev_info_str (void *);
--#define gt_ggc_m_13VEC_gimple_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_gimple_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_gimple_gc (void *);
--#define gt_ggc_m_9type_hash(X) do { \
--  if (X != NULL) gt_ggc_mx_type_hash (X);\
--  } while (0)
--extern void gt_ggc_mx_type_hash (void *);
--#define gt_ggc_m_16string_pool_data(X) do { \
--  if (X != NULL) gt_ggc_mx_string_pool_data (X);\
--  } while (0)
--extern void gt_ggc_mx_string_pool_data (void *);
--#define gt_ggc_m_13libfunc_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_libfunc_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_libfunc_entry (void *);
--#define gt_ggc_m_23temp_slot_address_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_temp_slot_address_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_temp_slot_address_entry (void *);
--#define gt_ggc_m_15throw_stmt_node(X) do { \
--  if (X != NULL) gt_ggc_mx_throw_stmt_node (X);\
--  } while (0)
--extern void gt_ggc_mx_throw_stmt_node (void *);
--#define gt_ggc_m_21VEC_eh_landing_pad_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_eh_landing_pad_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_eh_landing_pad_gc (void *);
--#define gt_ggc_m_16VEC_eh_region_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_eh_region_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_eh_region_gc (void *);
--#define gt_ggc_m_10eh_catch_d(X) do { \
--  if (X != NULL) gt_ggc_mx_eh_catch_d (X);\
--  } while (0)
--extern void gt_ggc_mx_eh_catch_d (void *);
--#define gt_ggc_m_16eh_landing_pad_d(X) do { \
--  if (X != NULL) gt_ggc_mx_eh_landing_pad_d (X);\
--  } while (0)
--extern void gt_ggc_mx_eh_landing_pad_d (void *);
--#define gt_ggc_m_11eh_region_d(X) do { \
--  if (X != NULL) gt_ggc_mx_eh_region_d (X);\
--  } while (0)
--extern void gt_ggc_mx_eh_region_d (void *);
--#define gt_ggc_m_10vcall_insn(X) do { \
--  if (X != NULL) gt_ggc_mx_vcall_insn (X);\
--  } while (0)
--extern void gt_ggc_mx_vcall_insn (void *);
--#define gt_ggc_m_18VEC_vcall_entry_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_vcall_entry_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_vcall_entry_gc (void *);
--#define gt_ggc_m_18VEC_dcall_entry_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_dcall_entry_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_dcall_entry_gc (void *);
--#define gt_ggc_m_16var_loc_list_def(X) do { \
--  if (X != NULL) gt_ggc_mx_var_loc_list_def (X);\
--  } while (0)
--extern void gt_ggc_mx_var_loc_list_def (void *);
--#define gt_ggc_m_12var_loc_node(X) do { \
--  if (X != NULL) gt_ggc_mx_var_loc_node (X);\
--  } while (0)
--extern void gt_ggc_mx_var_loc_node (void *);
--#define gt_ggc_m_20VEC_die_arg_entry_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_die_arg_entry_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_die_arg_entry_gc (void *);
--#define gt_ggc_m_16limbo_die_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_limbo_die_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_limbo_die_struct (void *);
--#define gt_ggc_m_20VEC_pubname_entry_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_pubname_entry_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_pubname_entry_gc (void *);
--#define gt_ggc_m_19VEC_dw_attr_node_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_dw_attr_node_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_dw_attr_node_gc (void *);
--#define gt_ggc_m_18comdat_type_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_comdat_type_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_comdat_type_struct (void *);
--#define gt_ggc_m_25dw_ranges_by_label_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_ranges_by_label_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_ranges_by_label_struct (void *);
--#define gt_ggc_m_16dw_ranges_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_ranges_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_ranges_struct (void *);
--#define gt_ggc_m_28dw_separate_line_info_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_separate_line_info_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_separate_line_info_struct (void *);
--#define gt_ggc_m_19dw_line_info_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_line_info_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_line_info_struct (void *);
--#define gt_ggc_m_25VEC_deferred_locations_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_deferred_locations_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_deferred_locations_gc (void *);
--#define gt_ggc_m_18dw_loc_list_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_loc_list_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_loc_list_struct (void *);
--#define gt_ggc_m_15dwarf_file_data(X) do { \
--  if (X != NULL) gt_ggc_mx_dwarf_file_data (X);\
--  } while (0)
--extern void gt_ggc_mx_dwarf_file_data (void *);
--#define gt_ggc_m_15queued_reg_save(X) do { \
--  if (X != NULL) gt_ggc_mx_queued_reg_save (X);\
--  } while (0)
--extern void gt_ggc_mx_queued_reg_save (void *);
--#define gt_ggc_m_20indirect_string_node(X) do { \
--  if (X != NULL) gt_ggc_mx_indirect_string_node (X);\
--  } while (0)
--extern void gt_ggc_mx_indirect_string_node (void *);
--#define gt_ggc_m_19dw_loc_descr_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_loc_descr_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_loc_descr_struct (void *);
--#define gt_ggc_m_13dw_fde_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_fde_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_fde_struct (void *);
--#define gt_ggc_m_13dw_cfi_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_dw_cfi_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_dw_cfi_struct (void *);
--#define gt_ggc_m_8typeinfo(X) do { \
--  if (X != NULL) gt_ggc_mx_typeinfo (X);\
--  } while (0)
--extern void gt_ggc_mx_typeinfo (void *);
--#define gt_ggc_m_22VEC_alias_set_entry_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_alias_set_entry_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_alias_set_entry_gc (void *);
--#define gt_ggc_m_17alias_set_entry_d(X) do { \
--  if (X != NULL) gt_ggc_mx_alias_set_entry_d (X);\
--  } while (0)
--extern void gt_ggc_mx_alias_set_entry_d (void *);
--#define gt_ggc_m_24constant_descriptor_tree(X) do { \
--  if (X != NULL) gt_ggc_mx_constant_descriptor_tree (X);\
--  } while (0)
--extern void gt_ggc_mx_constant_descriptor_tree (void *);
--#define gt_ggc_m_15cgraph_asm_node(X) do { \
--  if (X != NULL) gt_ggc_mx_cgraph_asm_node (X);\
--  } while (0)
--extern void gt_ggc_mx_cgraph_asm_node (void *);
--#define gt_ggc_m_12varpool_node(X) do { \
--  if (X != NULL) gt_ggc_mx_varpool_node (X);\
--  } while (0)
--extern void gt_ggc_mx_varpool_node (void *);
--#define gt_ggc_m_22VEC_cgraph_node_set_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_cgraph_node_set_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_cgraph_node_set_gc (void *);
--#define gt_ggc_m_19cgraph_node_set_def(X) do { \
--  if (X != NULL) gt_ggc_mx_cgraph_node_set_def (X);\
--  } while (0)
--extern void gt_ggc_mx_cgraph_node_set_def (void *);
--#define gt_ggc_m_27cgraph_node_set_element_def(X) do { \
--  if (X != NULL) gt_ggc_mx_cgraph_node_set_element_def (X);\
--  } while (0)
--extern void gt_ggc_mx_cgraph_node_set_element_def (void *);
--#define gt_ggc_m_22VEC_cgraph_node_ptr_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_cgraph_node_ptr_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_cgraph_node_ptr_gc (void *);
--#define gt_ggc_m_11cgraph_edge(X) do { \
--  if (X != NULL) gt_ggc_mx_cgraph_edge (X);\
--  } while (0)
--extern void gt_ggc_mx_cgraph_edge (void *);
--#define gt_ggc_m_24VEC_ipa_replace_map_p_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_ipa_replace_map_p_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_ipa_replace_map_p_gc (void *);
--#define gt_ggc_m_15ipa_replace_map(X) do { \
--  if (X != NULL) gt_ggc_mx_ipa_replace_map (X);\
--  } while (0)
--extern void gt_ggc_mx_ipa_replace_map (void *);
--#define gt_ggc_m_11cgraph_node(X) do { \
--  if (X != NULL) gt_ggc_mx_cgraph_node (X);\
--  } while (0)
--extern void gt_ggc_mx_cgraph_node (void *);
--#define gt_ggc_m_18VEC_basic_block_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_basic_block_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_basic_block_gc (void *);
--#define gt_ggc_m_14gimple_bb_info(X) do { \
--  if (X != NULL) gt_ggc_mx_gimple_bb_info (X);\
--  } while (0)
--extern void gt_ggc_mx_gimple_bb_info (void *);
--#define gt_ggc_m_11rtl_bb_info(X) do { \
--  if (X != NULL) gt_ggc_mx_rtl_bb_info (X);\
--  } while (0)
--extern void gt_ggc_mx_rtl_bb_info (void *);
--#define gt_ggc_m_11VEC_edge_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_edge_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_edge_gc (void *);
--#define gt_ggc_m_17cselib_val_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_cselib_val_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_cselib_val_struct (void *);
--#define gt_ggc_m_12elt_loc_list(X) do { \
--  if (X != NULL) gt_ggc_mx_elt_loc_list (X);\
--  } while (0)
--extern void gt_ggc_mx_elt_loc_list (void *);
--#define gt_ggc_m_13VEC_loop_p_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_loop_p_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_loop_p_gc (void *);
--#define gt_ggc_m_4loop(X) do { \
--  if (X != NULL) gt_ggc_mx_loop (X);\
--  } while (0)
--extern void gt_ggc_mx_loop (void *);
--#define gt_ggc_m_9loop_exit(X) do { \
--  if (X != NULL) gt_ggc_mx_loop_exit (X);\
--  } while (0)
--extern void gt_ggc_mx_loop_exit (void *);
--#define gt_ggc_m_13nb_iter_bound(X) do { \
--  if (X != NULL) gt_ggc_mx_nb_iter_bound (X);\
--  } while (0)
--extern void gt_ggc_mx_nb_iter_bound (void *);
--#define gt_ggc_m_24types_used_by_vars_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_types_used_by_vars_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_types_used_by_vars_entry (void *);
--#define gt_ggc_m_17language_function(X) do { \
--  if (X != NULL) gt_ggc_mx_language_function (X);\
--  } while (0)
--extern void gt_ggc_mx_language_function (void *);
--#define gt_ggc_m_5loops(X) do { \
--  if (X != NULL) gt_ggc_mx_loops (X);\
--  } while (0)
--extern void gt_ggc_mx_loops (void *);
--#define gt_ggc_m_18control_flow_graph(X) do { \
--  if (X != NULL) gt_ggc_mx_control_flow_graph (X);\
--  } while (0)
--extern void gt_ggc_mx_control_flow_graph (void *);
--#define gt_ggc_m_9eh_status(X) do { \
--  if (X != NULL) gt_ggc_mx_eh_status (X);\
--  } while (0)
--extern void gt_ggc_mx_eh_status (void *);
--#define gt_ggc_m_20initial_value_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_initial_value_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_initial_value_struct (void *);
--#define gt_ggc_m_17rtx_constant_pool(X) do { \
--  if (X != NULL) gt_ggc_mx_rtx_constant_pool (X);\
--  } while (0)
--extern void gt_ggc_mx_rtx_constant_pool (void *);
--#define gt_ggc_m_18VEC_temp_slot_p_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_temp_slot_p_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_temp_slot_p_gc (void *);
--#define gt_ggc_m_9temp_slot(X) do { \
--  if (X != NULL) gt_ggc_mx_temp_slot (X);\
--  } while (0)
--extern void gt_ggc_mx_temp_slot (void *);
--#define gt_ggc_m_9gimple_df(X) do { \
--  if (X != NULL) gt_ggc_mx_gimple_df (X);\
--  } while (0)
--extern void gt_ggc_mx_gimple_df (void *);
--#define gt_ggc_m_23VEC_call_site_record_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_call_site_record_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_call_site_record_gc (void *);
--#define gt_ggc_m_18call_site_record_d(X) do { \
--  if (X != NULL) gt_ggc_mx_call_site_record_d (X);\
--  } while (0)
--extern void gt_ggc_mx_call_site_record_d (void *);
--#define gt_ggc_m_14sequence_stack(X) do { \
--  if (X != NULL) gt_ggc_mx_sequence_stack (X);\
--  } while (0)
--extern void gt_ggc_mx_sequence_stack (void *);
--#define gt_ggc_m_8elt_list(X) do { \
--  if (X != NULL) gt_ggc_mx_elt_list (X);\
--  } while (0)
--extern void gt_ggc_mx_elt_list (void *);
--#define gt_ggc_m_17tree_priority_map(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_priority_map (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_priority_map (void *);
--#define gt_ggc_m_12tree_int_map(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_int_map (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_int_map (void *);
--#define gt_ggc_m_8tree_map(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_map (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_map (void *);
--#define gt_ggc_m_14lang_tree_node(X) do { \
--  if (X != NULL) gt_ggc_mx_lang_tree_node (X);\
--  } while (0)
--extern void gt_ggc_mx_lang_tree_node (void *);
--#define gt_ggc_m_24tree_statement_list_node(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_statement_list_node (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_statement_list_node (void *);
--#define gt_ggc_m_9lang_decl(X) do { \
--  if (X != NULL) gt_ggc_mx_lang_decl (X);\
--  } while (0)
--extern void gt_ggc_mx_lang_decl (void *);
--#define gt_ggc_m_9lang_type(X) do { \
--  if (X != NULL) gt_ggc_mx_lang_type (X);\
--  } while (0)
--extern void gt_ggc_mx_lang_type (void *);
--#define gt_ggc_m_10die_struct(X) do { \
--  if (X != NULL) gt_ggc_mx_die_struct (X);\
--  } while (0)
--extern void gt_ggc_mx_die_struct (void *);
--#define gt_ggc_m_15varray_head_tag(X) do { \
--  if (X != NULL) gt_ggc_mx_varray_head_tag (X);\
--  } while (0)
--extern void gt_ggc_mx_varray_head_tag (void *);
--#define gt_ggc_m_12ptr_info_def(X) do { \
--  if (X != NULL) gt_ggc_mx_ptr_info_def (X);\
--  } while (0)
--extern void gt_ggc_mx_ptr_info_def (void *);
--#define gt_ggc_m_22VEC_constructor_elt_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_constructor_elt_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_constructor_elt_gc (void *);
--#define gt_ggc_m_10tree_ann_d(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_ann_d (X);\
--  } while (0)
--extern void gt_ggc_mx_tree_ann_d (void *);
--#define gt_ggc_m_17VEC_alias_pair_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_alias_pair_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_alias_pair_gc (void *);
--#define gt_ggc_m_11VEC_tree_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_tree_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_tree_gc (void *);
--#define gt_ggc_m_12VEC_uchar_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_uchar_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_uchar_gc (void *);
--#define gt_ggc_m_8function(X) do { \
--  if (X != NULL) gt_ggc_mx_function (X);\
--  } while (0)
--extern void gt_ggc_mx_function (void *);
--#define gt_ggc_m_23constant_descriptor_rtx(X) do { \
--  if (X != NULL) gt_ggc_mx_constant_descriptor_rtx (X);\
--  } while (0)
--extern void gt_ggc_mx_constant_descriptor_rtx (void *);
--#define gt_ggc_m_11fixed_value(X) do { \
--  if (X != NULL) gt_ggc_mx_fixed_value (X);\
--  } while (0)
--extern void gt_ggc_mx_fixed_value (void *);
--#define gt_ggc_m_10real_value(X) do { \
--  if (X != NULL) gt_ggc_mx_real_value (X);\
--  } while (0)
--extern void gt_ggc_mx_real_value (void *);
--#define gt_ggc_m_10VEC_rtx_gc(X) do { \
--  if (X != NULL) gt_ggc_mx_VEC_rtx_gc (X);\
--  } while (0)
--extern void gt_ggc_mx_VEC_rtx_gc (void *);
--#define gt_ggc_m_12object_block(X) do { \
--  if (X != NULL) gt_ggc_mx_object_block (X);\
--  } while (0)
--extern void gt_ggc_mx_object_block (void *);
--#define gt_ggc_m_9reg_attrs(X) do { \
--  if (X != NULL) gt_ggc_mx_reg_attrs (X);\
--  } while (0)
--extern void gt_ggc_mx_reg_attrs (void *);
--#define gt_ggc_m_9mem_attrs(X) do { \
--  if (X != NULL) gt_ggc_mx_mem_attrs (X);\
--  } while (0)
--extern void gt_ggc_mx_mem_attrs (void *);
--#define gt_ggc_m_14bitmap_obstack(X) do { \
--  if (X != NULL) gt_ggc_mx_bitmap_obstack (X);\
--  } while (0)
--extern void gt_ggc_mx_bitmap_obstack (void *);
--#define gt_ggc_m_18bitmap_element_def(X) do { \
--  if (X != NULL) gt_ggc_mx_bitmap_element_def (X);\
--  } while (0)
--extern void gt_ggc_mx_bitmap_element_def (void *);
--#define gt_ggc_m_16machine_function(X) do { \
--  if (X != NULL) gt_ggc_mx_machine_function (X);\
--  } while (0)
--extern void gt_ggc_mx_machine_function (void *);
--#define gt_ggc_m_17stack_local_entry(X) do { \
--  if (X != NULL) gt_ggc_mx_stack_local_entry (X);\
--  } while (0)
--extern void gt_ggc_mx_stack_local_entry (void *);
--#define gt_ggc_m_15basic_block_def(X) do { \
--  if (X != NULL) gt_ggc_mx_basic_block_def (X);\
--  } while (0)
--extern void gt_ggc_mx_basic_block_def (void *);
--#define gt_ggc_m_8edge_def(X) do { \
--  if (X != NULL) gt_ggc_mx_edge_def (X);\
--  } while (0)
--extern void gt_ggc_mx_edge_def (void *);
--#define gt_ggc_m_17gimple_seq_node_d(X) do { \
--  if (X != NULL) gt_ggc_mx_gimple_seq_node_d (X);\
--  } while (0)
--extern void gt_ggc_mx_gimple_seq_node_d (void *);
--#define gt_ggc_m_12gimple_seq_d(X) do { \
--  if (X != NULL) gt_ggc_mx_gimple_seq_d (X);\
--  } while (0)
--extern void gt_ggc_mx_gimple_seq_d (void *);
--#define gt_ggc_m_7section(X) do { \
--  if (X != NULL) gt_ggc_mx_section (X);\
--  } while (0)
--extern void gt_ggc_mx_section (void *);
--#define gt_ggc_m_18gimple_statement_d(X) do { \
--  if (X != NULL) gt_ggc_mx_gimple_statement_d (X);\
--  } while (0)
--extern void gt_ggc_mx_gimple_statement_d (void *);
--#define gt_ggc_m_9rtvec_def(X) do { \
--  if (X != NULL) gt_ggc_mx_rtvec_def (X);\
--  } while (0)
--extern void gt_ggc_mx_rtvec_def (void *);
--#define gt_ggc_m_7rtx_def(X) do { \
--  if (X != NULL) gt_ggc_mx_rtx_def (X);\
--  } while (0)
--extern void gt_ggc_mx_rtx_def (void *);
--#define gt_ggc_m_15bitmap_head_def(X) do { \
--  if (X != NULL) gt_ggc_mx_bitmap_head_def (X);\
--  } while (0)
--extern void gt_ggc_mx_bitmap_head_def (void *);
--#define gt_ggc_m_9tree_node(X) do { \
--  if (X != NULL) gt_ggc_mx_tree_node (X);\
--  } while (0)
--#define gt_ggc_mx_tree_node gt_ggc_mx_lang_tree_node
--#define gt_ggc_m_6answer(X) do { \
--  if (X != NULL) gt_ggc_mx_answer (X);\
--  } while (0)
--extern void gt_ggc_mx_answer (void *);
--#define gt_ggc_m_9cpp_macro(X) do { \
--  if (X != NULL) gt_ggc_mx_cpp_macro (X);\
--  } while (0)
--extern void gt_ggc_mx_cpp_macro (void *);
--#define gt_ggc_m_9cpp_token(X) do { \
--  if (X != NULL) gt_ggc_mx_cpp_token (X);\
--  } while (0)
--extern void gt_ggc_mx_cpp_token (void *);
--#define gt_ggc_m_9line_maps(X) do { \
--  if (X != NULL) gt_ggc_mx_line_maps (X);\
--  } while (0)
--extern void gt_ggc_mx_line_maps (void *);
--extern void gt_ggc_m_II17splay_tree_node_s (void *);
--extern void gt_ggc_m_SP9tree_node17splay_tree_node_s (void *);
--extern void gt_ggc_m_P9tree_nodeP9tree_node17splay_tree_node_s (void *);
--extern void gt_ggc_m_IP9tree_node17splay_tree_node_s (void *);
--extern void gt_ggc_m_P13tree_llvm_map4htab (void *);
--extern void gt_ggc_m_P15interface_tuple4htab (void *);
--extern void gt_ggc_m_P16volatilized_type4htab (void *);
--extern void gt_ggc_m_P17string_descriptor4htab (void *);
--extern void gt_ggc_m_P14type_assertion4htab (void *);
--extern void gt_ggc_m_P18treetreehash_entry4htab (void *);
--extern void gt_ggc_m_P17module_htab_entry4htab (void *);
--extern void gt_ggc_m_P16def_pragma_macro4htab (void *);
--extern void gt_ggc_m_P21pending_abstract_type4htab (void *);
--extern void gt_ggc_m_P10spec_entry4htab (void *);
--extern void gt_ggc_m_P16cxx_int_tree_map4htab (void *);
--extern void gt_ggc_m_P17named_label_entry4htab (void *);
--extern void gt_ggc_m_P12tree_int_map4htab (void *);
--extern void gt_ggc_m_P20lto_symtab_entry_def4htab (void *);
--extern void gt_ggc_m_IP9tree_node12splay_tree_s (void *);
--extern void gt_ggc_m_P9tree_nodeP9tree_node12splay_tree_s (void *);
--extern void gt_ggc_m_P12varpool_node4htab (void *);
--extern void gt_ggc_m_P13scev_info_str4htab (void *);
--extern void gt_ggc_m_P23constant_descriptor_rtx4htab (void *);
--extern void gt_ggc_m_P24constant_descriptor_tree4htab (void *);
--extern void gt_ggc_m_P12object_block4htab (void *);
--extern void gt_ggc_m_P7section4htab (void *);
--extern void gt_ggc_m_P17tree_priority_map4htab (void *);
--extern void gt_ggc_m_P8tree_map4htab (void *);
--extern void gt_ggc_m_P9type_hash4htab (void *);
--extern void gt_ggc_m_P13libfunc_entry4htab (void *);
--extern void gt_ggc_m_P23temp_slot_address_entry4htab (void *);
--extern void gt_ggc_m_P15throw_stmt_node4htab (void *);
--extern void gt_ggc_m_P9reg_attrs4htab (void *);
--extern void gt_ggc_m_P9mem_attrs4htab (void *);
--extern void gt_ggc_m_P7rtx_def4htab (void *);
--extern void gt_ggc_m_SP9tree_node12splay_tree_s (void *);
--extern void gt_ggc_m_P10vcall_insn4htab (void *);
--extern void gt_ggc_m_P16var_loc_list_def4htab (void *);
--extern void gt_ggc_m_P10die_struct4htab (void *);
--extern void gt_ggc_m_P15dwarf_file_data4htab (void *);
--extern void gt_ggc_m_P20indirect_string_node4htab (void *);
--extern void gt_ggc_m_P11cgraph_node4htab (void *);
--extern void gt_ggc_m_II12splay_tree_s (void *);
--extern void gt_ggc_m_P27cgraph_node_set_element_def4htab (void *);
--extern void gt_ggc_m_P11cgraph_edge4htab (void *);
--extern void gt_ggc_m_P9loop_exit4htab (void *);
--extern void gt_ggc_m_P24types_used_by_vars_entry4htab (void *);
--extern void gt_ggc_m_P9tree_node4htab (void *);
--
--/* functions code */
--
--void
--gt_ggc_mx_tree_llvm_map (void *x_p)
--{
--  struct tree_llvm_map * const x = (struct tree_llvm_map *)x_p;
--  if (ggc_test_and_set_mark (x))
--    {
--      gt_ggc_m_9tree_node ((*x).base.from);
--    }
--}
--
--void
--gt_ggc_m_P13tree_llvm_map4htab (void *x_p)
--{
--  struct htab * const x = (struct htab *)x_p;
--  if (ggc_test_and_set_mark (x))
--    {
--      if ((*x).entries != NULL) {
--        size_t i0;
--        for (i0 = 0; i0 != (size_t)(((*x)).size); i0++) {
--          gt_ggc_m_13tree_llvm_map ((*x).entries[i0]);
--        }
--        ggc_mark ((*x).entries);
--      }
--    }
--}
--
--/* GC roots.  */
--
--EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc__gt_llvm_cache_h[] = {
--  {
--    &llvm_cache,
--    1,
--    sizeof (llvm_cache),
--    &gt_ggc_mx_tree_llvm_map,
--    NULL,
--    &tree_llvm_map_marked_p
--  },
--  LAST_GGC_CACHE_TAB
--};
--
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/ABI.h dragonegg-2.9-new/include/dragonegg/ABI.h
---- dragonegg-2.9-old/include/dragonegg/ABI.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/ABI.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,351 @@
-+//===--------- ABI.h - Processor ABI customization hooks --------*- C++ -*-===//
-+//
-+// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011  Chris Lattner,
-+// Duncan Sands et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file specifies how argument values are passed and returned from function
-+// calls.  This allows the target to specialize handling of things like how
-+// structures are passed by-value.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_ABI_H
-+#define DRAGONEGG_ABI_H
-+
-+// Plugin headers
-+#include "dragonegg/Internals.h"
-+#include "dragonegg/Target.h"
-+
-+// LLVM headers
-+#include "llvm/LLVMContext.h"
-+#include "llvm/DataLayout.h"
-+
-+namespace llvm {
-+  class BasicBlock;
-+}
-+
-+/// DefaultABIClient - This is a simple implementation of the ABI client
-+/// interface that can be subclassed.
-+struct DefaultABIClient {
-+  virtual ~DefaultABIClient() {}
-+  virtual CallingConv::ID& getCallingConv(void) = 0;
-+  virtual bool isShadowReturn() const { return false; }
-+
-+  /// HandleScalarResult - This callback is invoked if the function returns a
-+  /// simple scalar result value, which is of type RetTy.
-+  virtual void HandleScalarResult(const Type * /*RetTy*/) {}
-+
-+  /// HandleAggregateResultAsScalar - This callback is invoked if the function
-+  /// returns an aggregate value by bit converting it to the specified scalar
-+  /// type and returning that.  The bit conversion should start at byte Offset
-+  /// within the struct, and ScalarTy is not necessarily big enough to cover
-+  /// the entire struct.
-+  virtual void HandleAggregateResultAsScalar(const Type * /*ScalarTy*/,
-+                                             unsigned /*Offset*/ = 0) {}
-+
-+  /// HandleAggregateResultAsAggregate - This callback is invoked if the function
-+  /// returns an aggregate value using multiple return values.
-+  virtual void HandleAggregateResultAsAggregate(const Type * /*AggrTy*/) {}
-+
-+  /// HandleAggregateShadowResult - This callback is invoked if the function
-+  /// returns an aggregate value by using a "shadow" first parameter, which is
-+  /// a pointer to the aggregate, of type PtrArgTy.  If RetPtr is set to true,
-+  /// the pointer argument itself is returned from the function.
-+  virtual void HandleAggregateShadowResult(const PointerType * /*PtrArgTy*/,
-+                                           bool /*RetPtr*/) {}
-+
-+  /// HandleScalarShadowResult - This callback is invoked if the function
-+  /// returns a scalar value by using a "shadow" first parameter, which is a
-+  /// pointer to the scalar, of type PtrArgTy.  If RetPtr is set to true,
-+  /// the pointer argument itself is returned from the function.
-+  virtual void HandleScalarShadowResult(const PointerType * /*PtrArgTy*/,
-+                                        bool /*RetPtr*/) {}
-+
-+
-+  /// HandleScalarArgument - This is the primary callback that specifies an
-+  /// LLVM argument to pass.  It is only used for first class types.
-+  /// If RealSize is non Zero then it specifies number of bytes to access
-+  /// from LLVMTy.
-+  virtual void HandleScalarArgument(const llvm::Type * /*LLVMTy*/,
-+                                    tree_node * /*type*/,
-+                                    unsigned /*RealSize*/ = 0) {}
-+
-+  /// HandleByInvisibleReferenceArgument - This callback is invoked if a pointer
-+  /// (of type PtrTy) to the argument is passed rather than the argument itself.
-+  virtual void HandleByInvisibleReferenceArgument(const llvm::Type * /*PtrTy*/,
-+                                                  tree_node * /*type*/) {}
-+
-+  /// HandleByValArgument - This callback is invoked if the aggregate function
-+  /// argument is passed by value.
-+  virtual void HandleByValArgument(const llvm::Type * /*LLVMTy*/,
-+                                   tree_node * /*type*/) {}
-+
-+  /// HandleFCAArgument - This callback is invoked if the aggregate function
-+  /// argument is passed by value as a first class aggregate.
-+  virtual void HandleFCAArgument(const llvm::Type * /*LLVMTy*/,
-+                                 tree_node * /*type*/) {}
-+
-+  /// EnterField - Called when we're about the enter the field of a struct
-+  /// or union.  FieldNo is the number of the element we are entering in the
-+  /// LLVM Struct, StructTy is the LLVM type of the struct we are entering.
-+  virtual void EnterField(unsigned /*FieldNo*/,
-+                          const llvm::Type * /*StructTy*/) {}
-+  virtual void ExitField() {}
-+  virtual void HandlePad(const llvm::Type * /*LLVMTy*/) {}
-+};
-+
-+// LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY - A hook to allow
-+// special _Complex handling. Return true if X should be returned using
-+// multiple value return instruction.
-+#ifndef LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY
-+#define LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY(X) \
-+ false
-+#endif
-+
-+// LLVM_SHOULD_NOT_USE_SHADOW_RETURN - A hook to allow aggregates to be
-+// returned in registers.
-+#ifndef LLVM_SHOULD_NOT_USE_SHADOW_RETURN
-+#define LLVM_SHOULD_NOT_USE_SHADOW_RETURN(X, CC) \
-+ false
-+#endif
-+
-+// doNotUseShadowReturn - Return true if the specified GCC type
-+// should not be returned using a pointer to struct parameter.
-+extern bool doNotUseShadowReturn(tree_node *type, tree_node *fndecl,
-+                                 CallingConv::ID CC);
-+
-+/// isSingleElementStructOrArray - If this is (recursively) a structure with one
-+/// field or an array with one element, return the field type, otherwise return
-+/// null.  Returns null for complex number types.  If ignoreZeroLength, the
-+/// struct (recursively) may include zero-length fields in addition to the
-+/// single element that has data.  If rejectFatBitField, and the single element
-+/// is a bitfield of a type that's bigger than the struct, return null anyway.
-+extern tree_node *isSingleElementStructOrArray(tree_node *type,
-+                                               bool ignoreZeroLength,
-+                                               bool rejectFatBitfield);
-+
-+/// isZeroSizedStructOrUnion - Returns true if this is a struct or union
-+/// which is zero bits wide.
-+extern bool isZeroSizedStructOrUnion(tree_node *type);
-+
-+// getLLVMScalarTypeForStructReturn - Return LLVM Type if TY can be
-+// returned as a scalar, otherwise return NULL. This is the default
-+// target independent implementation.
-+static inline
-+const Type* getLLVMScalarTypeForStructReturn(tree_node *type, unsigned *Offset) {
-+  const Type *Ty = ConvertType(type);
-+  unsigned Size = getDataLayout().getTypeAllocSize(Ty);
-+  *Offset = 0;
-+  if (Size == 0)
-+    return Type::getVoidTy(getGlobalContext());
-+  else if (Size == 1)
-+    return Type::getInt8Ty(getGlobalContext());
-+  else if (Size == 2)
-+    return Type::getInt16Ty(getGlobalContext());
-+  else if (Size <= 4)
-+    return Type::getInt32Ty(getGlobalContext());
-+  else if (Size <= 8)
-+    return Type::getInt64Ty(getGlobalContext());
-+  else if (Size <= 16)
-+    return IntegerType::get(getGlobalContext(), 128);
-+  else if (Size <= 32)
-+    return IntegerType::get(getGlobalContext(), 256);
-+
-+  return NULL;
-+}
-+
-+// getLLVMAggregateTypeForStructReturn - Return LLVM type if TY can be
-+// returns as multiple values, otherwise return NULL. This is the default
-+// target independent implementation.
-+static inline
-+const Type* getLLVMAggregateTypeForStructReturn(tree_node * /*type*/) {
-+  return NULL;
-+}
-+
-+#ifndef LLVM_TRY_PASS_AGGREGATE_CUSTOM
-+#define LLVM_TRY_PASS_AGGREGATE_CUSTOM(T, E, CC, C) \
-+  false
-+#endif
-+
-+// LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS - Return true if this vector
-+// type should be passed as integer registers.  Generally vectors which are
-+// not part of the target architecture should do this.
-+#ifndef LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS
-+#define LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(TY) \
-+  false
-+#endif
-+
-+// LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR - Return true if this vector
-+// type should be passed byval.  Used for generic vectors on x86-64.
-+#ifndef LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR
-+#define LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(X) \
-+  false
-+#endif
-+
-+// LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR - Return true if this aggregate
-+// value should be passed by value, i.e. passing its address with the byval
-+// attribute bit set. The default is false.
-+#ifndef LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR
-+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY) \
-+    false
-+#endif
-+
-+// LLVM_SHOULD_PASS_AGGREGATE_AS_FCA - Return true if this aggregate value
-+// should be passed by value as a first class aggregate. The default is false.
-+#ifndef LLVM_SHOULD_PASS_AGGREGATE_AS_FCA
-+#define LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(X, TY) \
-+    false
-+#endif
-+
-+// LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS - Return true if this aggregate
-+// value should be passed in a mixture of integer, floating point, and vector
-+// registers. The routine should also return by reference a vector of the
-+// types of the registers being used. The default is false.
-+#ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS
-+#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E) \
-+    false
-+#endif
-+
-+// LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS - Only called if
-+// LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS returns true. This returns true if
-+// there are only enough unused argument passing registers to pass a part of
-+// the aggregate. Note, this routine should return false if none of the needed
-+// registers are available.
-+#ifndef LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS
-+#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC) \
-+    false
-+#endif
-+
-+// LLVM_BYVAL_ALIGNMENT - Returns the alignment of the type in bytes, if known,
-+// in the getGlobalContext() of its use as a function parameter.
-+// Note that the alignment in the TYPE node is usually the alignment appropriate
-+// when the type is used within a struct, which may or may not be appropriate
-+// here.
-+#ifndef LLVM_BYVAL_ALIGNMENT
-+#define LLVM_BYVAL_ALIGNMENT(T)  0
-+#endif
-+
-+// LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS - Return true if this aggregate
-+// value should be passed in integer registers.  By default, we do this for all
-+// values that are not single-element structs.  This ensures that things like
-+// {short,short} are passed in one 32-bit chunk, not as two arguments (which
-+// would often be 64-bits).  We also do it for single-element structs when the
-+// single element is a bitfield of a type bigger than the struct; the code
-+// for field-by-field struct passing does not handle this one right.
-+#ifndef LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS
-+#define LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(X, Y, Z) \
-+   !isSingleElementStructOrArray((X), false, true)
-+#endif
-+
-+// LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR - Return a TYPE tree if this single
-+// element struct should be returned using the convention for that scalar TYPE,
-+// 0 otherwise.
-+// The returned TYPE must be the same size as X for this to work; that is
-+// checked elsewhere.  (Structs where this is not the case can be constructed
-+// by abusing the __aligned__ attribute.)
-+#ifndef LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR
-+#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \
-+  isSingleElementStructOrArray(X, false, false)
-+#endif
-+
-+// LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR - Return a TYPE tree if this vector type
-+// should be returned using the convention for that scalar TYPE, 0 otherwise.
-+// X may be evaluated more than once.
-+#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR
-+#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X,Y) 0
-+#endif
-+
-+// LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW - Return true if this vector type
-+// should be returned using the aggregate shadow (sret) convention, 0 otherwise.
-+// X may be evaluated more than once.
-+#ifndef LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW
-+#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X,Y) 0
-+#endif
-+
-+// LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
-+// returned as a scalar, otherwise return NULL.
-+#ifndef LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN
-+#define LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN(X, Y) \
-+  getLLVMScalarTypeForStructReturn((X), (Y))
-+#endif
-+
-+// LLVM_AGGR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
-+// returned as an aggregate, otherwise return NULL.
-+#ifndef LLVM_AGGR_TYPE_FOR_STRUCT_RETURN
-+#define LLVM_AGGR_TYPE_FOR_STRUCT_RETURN(X, CC)    \
-+  getLLVMAggregateTypeForStructReturn(X)
-+#endif
-+
-+// LLVM_EXTRACT_MULTIPLE_RETURN_VALUE - Extract multiple return value from
-+// SRC and assign it to DEST. Each target that supports multiple return
-+// value must implement this hook.
-+#ifndef LLVM_EXTRACT_MULTIPLE_RETURN_VALUE
-+#define LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,V,B)     \
-+  llvm_default_extract_multiple_return_value((Src),(Dest),(V),(B))
-+#endif
-+static inline
-+void llvm_default_extract_multiple_return_value(Value * /*Src*/, Value * /*Dest*/,
-+                                                bool /*isVolatile*/,
-+                                                LLVMBuilder &/*Builder*/) {
-+  assert (0 && "LLVM_EXTRACT_MULTIPLE_RETURN_VALUE is not implemented!");
-+}
-+
-+/// DefaultABI - This class implements the default LLVM ABI where structures are
-+/// passed by decimating them into individual components and unions are passed
-+/// by passing the largest member of the union.
-+///
-+class DefaultABI {
-+protected:
-+  DefaultABIClient &C;
-+public:
-+  DefaultABI(DefaultABIClient &c);
-+
-+  bool isShadowReturn() const;
-+
-+  /// HandleReturnType - This is invoked by the target-independent code for the
-+  /// return type. It potentially breaks down the argument and invokes methods
-+  /// on the client that indicate how its pieces should be handled.  This
-+  /// handles things like returning structures via hidden parameters.
-+  void HandleReturnType(tree_node *type, tree_node *fn, bool isBuiltin);
-+
-+  /// HandleArgument - This is invoked by the target-independent code for each
-+  /// argument type passed into the function.  It potentially breaks down the
-+  /// argument and invokes methods on the client that indicate how its pieces
-+  /// should be handled.  This handles things like decimating structures into
-+  /// their fields.
-+  void HandleArgument(tree_node *type, std::vector<const Type*> &ScalarElts,
-+                      Attributes *Attributes = NULL);
-+
-+  /// HandleUnion - Handle a UNION_TYPE or QUAL_UNION_TYPE tree.
-+  ///
-+  void HandleUnion(tree_node *type, std::vector<const Type*> &ScalarElts);
-+
-+  /// PassInIntegerRegisters - Given an aggregate value that should be passed in
-+  /// integer registers, convert it to a structure containing ints and pass all
-+  /// of the struct elements in.  If Size is set we pass only that many bytes.
-+  void PassInIntegerRegisters(tree_node *type,
-+                              std::vector<const Type*> &ScalarElts,
-+                              unsigned origSize, bool DontCheckAlignment);
-+
-+  /// PassInMixedRegisters - Given an aggregate value that should be passed in
-+  /// mixed integer, floating point, and vector registers, convert it to a
-+  /// structure containing the specified struct elements in.
-+  void PassInMixedRegisters(const Type *Ty, std::vector<const Type*> &OrigElts,
-+                            std::vector<const Type*> &ScalarElts);
-+};
-+
-+#endif /* DRAGONEGG_ABI_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/ADT/IntervalList.h dragonegg-2.9-new/include/dragonegg/ADT/IntervalList.h
---- dragonegg-2.9-old/include/dragonegg/ADT/IntervalList.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/ADT/IntervalList.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,218 @@
-+//=--------- IntervalList.h - List of disjoint intervals ----------*- C++ -*-=//
-+//
-+// Copyright (C) 2011  Duncan Sands.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares a utility class for maintaining a collection of pairwise
-+// disjoint intervals.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_INTERVALLIST_H
-+#define DRAGONEGG_INTERVALLIST_H
-+
-+// Plugin headers
-+#include "dragonegg/ADT/Range.h"
-+
-+// LLVM headers
-+#include "llvm/ADT/SmallVector.h"
-+
-+/// IntervalList - Maintains a list of disjoint intervals.  Type 'T' represents
-+/// an interval, and should have a getRange method which returns a range of 'U'
-+/// values.  In addition it should provide ChangeRangeTo for growing, shrinking
-+/// and otherwise changing the shape of the interval; and JoinWith for replacing
-+/// the interval with the convex hull of its union with another interval (which
-+/// is guaranteed to be disjoint from the original).
-+template <class T, typename U, unsigned N>
-+class IntervalList {
-+  typedef typename llvm::SmallVector<T, N> List;
-+  typedef typename List::iterator iterator;
-+
-+  List Intervals;
-+  // The actual intervals.  Always disjoint, sorted and non-empty.
-+
-+  /// CmpFirst - Compare intervals based on where they start.
-+  static bool CmpFirst(const T &L, const T &R) {
-+    return L.getRange().getFirst() < R.getRange().getFirst();
-+  }
-+
-+  /// CmpLast - Compare intervals based on where they stop.
-+  static bool CmpLast(const T &L, const T &R) {
-+    return L.getRange().getLast() < R.getRange().getLast();
-+  }
-+
-+  /// isSane - Return true if the intervals are non-empty, disjoint and
-+  /// sorted.
-+  bool isSane() const {
-+    for (unsigned i = 0, e = Intervals.size(); i < e; ++i) {
-+      if (Intervals[i].getRange().empty())
-+        return false;
-+      if (i && Intervals[i].getRange().getFirst() <
-+          Intervals[i-1].getRange().getLast())
-+        return false;
-+    }
-+    return true;
-+  }
-+
-+public:
-+
-+  /// AddInterval - Add the given interval to the list.  If it overlaps any
-+  /// existing intervals then the existing intervals are pruned by removing
-+  /// exactly the parts of them that overlap the new interval.  If the added
-+  /// interval is empty then it will be discarded.
-+  void AddInterval(const T &S);
-+
-+  /// getNumIntervals - Return the number of intervals in the list.
-+  unsigned getNumIntervals() const {
-+    return Intervals.size();
-+  }
-+
-+  /// getInterval - Return the interval with the given index.
-+  T getInterval(unsigned Idx) {
-+    return Intervals[Idx];
-+  }
-+
-+  /// AlignBoundaries - Ensure that all intervals begin and end on a multiple of
-+  /// the given value.
-+  void AlignBoundaries(unsigned Alignment);
-+};
-+
-+/// AddInterval - Add the given interval to the list.  If it overlaps any
-+/// existing intervals then the existing intervals are pruned by removing
-+/// exactly the parts of them that overlap the new interval.  If the added
-+/// interval is empty then it will be discarded.
-+template <class T, typename U, unsigned N>
-+void IntervalList<T, U, N>::AddInterval(const T &Interval) {
-+  const Range<U> NewRange = Interval.getRange();
-+
-+  // If the new interval is empty then there is no point in adding it.
-+  if (NewRange.empty())
-+    return;
-+
-+  // If this is the first interval then it cannot overlap any others.
-+  if (Intervals.empty()) {
-+    Intervals.push_back(Interval);
-+    return;
-+  }
-+
-+  // Check for overlap with existing intervals.
-+  iterator Lo = std::lower_bound(Intervals.begin(), Intervals.end(), Interval,
-+                                 CmpFirst);
-+  iterator Hi = std::upper_bound(Intervals.begin(), Intervals.end(), Interval,
-+                                 CmpLast);
-+  if (Lo < Hi) {
-+    // Intervals with index in [Lo, Hi) are those completely covered by the new
-+    // interval.  Throw them away.
-+    for (iterator I = Lo; I != Hi; ++I)
-+      assert(NewRange.contains(I->getRange()) && "Old interval not covered!");
-+    Intervals.erase(Lo, Hi);
-+    Hi = Lo;
-+  } else if (Hi < Lo) {
-+    // The new interval is contained in Hi with an excedent at each end.  Chop
-+    // the old interval into two pieces (the lower and upper parts) and insert
-+    // the new interval between them.
-+    const Range<U> OldRange = Hi->getRange();
-+    assert(OldRange.contains(NewRange) && "New interval not contained in old!");
-+    const Range<U> LowerRange(OldRange.getFirst(), NewRange.getFirst());
-+    const Range<U> UpperRange(NewRange.getLast(), OldRange.getLast());
-+    assert(!LowerRange.empty() && !UpperRange.empty() && "Degenerate end!");
-+    T UpperPart = *Hi;
-+    Hi->ChangeRangeTo(LowerRange);
-+    UpperPart.ChangeRangeTo(UpperRange);
-+    Lo = Intervals.insert(Lo, UpperPart);
-+    Intervals.insert(Lo, Interval);
-+    assert(isSane() && "Interval added wrong!");
-+    return;
-+  }
-+  assert(Lo == Hi);
-+  // Check for overlap with the preceding interval.
-+  if (Lo != Intervals.begin()) {
-+    const iterator Prev = Lo - 1;
-+    const Range<U> PrevRange = Prev->getRange();
-+    if (NewRange.getFirst() < PrevRange.getLast())
-+      // Shrink the previous interval to remove the overlap.
-+      Prev->ChangeRangeTo(Range<U>(PrevRange.getFirst(), NewRange.getFirst()));
-+  }
-+  // Check for overlap with the following interval.
-+  if (Lo != Intervals.end()) {
-+    const iterator Next = Lo;
-+    const Range<U> NextRange = Next->getRange();
-+    if (NextRange.getFirst() < NewRange.getLast())
-+      // Shrink the next interval to remove the overlap.
-+      Next->ChangeRangeTo(Range<U>(NewRange.getLast(), NextRange.getLast()));
-+  }
-+  // The new interval is now disjoint from any existing intervals.  Insert it.
-+  Intervals.insert(Lo, Interval);
-+  assert(isSane() && "Interval added wrong!");
-+}
-+
-+/// AlignBoundaries - Ensure that all intervals begin and end on a multiple of
-+/// the given value.
-+template <class T, typename U, unsigned N>
-+void IntervalList<T, U, N>::AlignBoundaries(unsigned Alignment) {
-+  assert(Alignment > 0 && "Alignment should be positive!");
-+  for (iterator SI = Intervals.begin(); SI != Intervals.end(); ++SI) {
-+    T &Interval = *SI;
-+    Range<U> OrigRange = Interval.getRange();
-+
-+    // Round the start of the interval down and the end of the interval up to
-+    // the nearest multiple of the alignment.
-+    U RoundedFirst = OrigRange.getFirst() - (OrigRange.getFirst() % Alignment);
-+    U RoundedLast = OrigRange.getLast() + Alignment - 1;
-+    RoundedLast -= RoundedLast % Alignment;
-+    Range<U> AlignedRange(RoundedFirst, RoundedLast);
-+
-+    // There is nothing to do if the interval is already aligned.
-+    if (OrigRange == AlignedRange)
-+      continue;
-+
-+    // Merge in all following intervals that start before RoundedLast.
-+    iterator Next = SI + 1;
-+    for (; Next != Intervals.end() && Next->getRange().getFirst() < RoundedLast;
-+         ++Next)
-+      Interval.JoinWith(*Next);
-+    assert(Interval.getRange().getFirst() == OrigRange.getFirst() &&
-+           "Merging at end changed start!");
-+
-+    // If merging caused the interval to extend beyond RoundedLast then chop the
-+    // interval in two at RoundedLast.  This stops intervals getting huge due to
-+    // repeated merging.
-+    if (Interval.getRange().getLast() > RoundedLast) {
-+      Range<U> LowerR(OrigRange.getFirst(), RoundedLast);
-+      Range<U> UpperR(RoundedLast, Interval.getRange().getLast());
-+      // We must have merged in at least the next interval.  Reuse it to hold
-+      // the part we chop off the end.
-+      T &J = *(SI + 1) = Interval;
-+      // Chop the end off the original interval so that it stops at RoundedLast
-+      // and at the same time extend the start of the original interval down to
-+      // the alignment boundary.
-+      Interval.ChangeRangeTo(AlignedRange);
-+      // Chop the start off the new (following) interval so that it begins at
-+      // RoundedLast.
-+      J.ChangeRangeTo(UpperR);
-+      // Delete any other merged intervals.
-+      Intervals.erase(SI + 2, Next);
-+    } else {
-+      // The interval didn't grow beyond the original alignment boundary.  Round
-+      // it to those boundaries.
-+      Interval.ChangeRangeTo(AlignedRange);
-+      // Delete any merged intervals.
-+      Intervals.erase(SI + 1, Next);
-+    }
-+  }
-+}
-+
-+#endif /* DRAGONEGG_INTERVALLIST_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/ADT/Range.h dragonegg-2.9-new/include/dragonegg/ADT/Range.h
---- dragonegg-2.9-old/include/dragonegg/ADT/Range.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/ADT/Range.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,106 @@
-+//=------------------ Range.h - Interval of values ----------------*- C++ -*-=//
-+//
-+// Copyright (C) 2011  Duncan Sands.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares a utility class for representing an interval of values.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_RANGE_H
-+#define DRAGONEGG_RANGE_H
-+
-+/// Range - Represents the interval [First, Last).
-+template<typename T>
-+class Range {
-+  T First, Last;
-+public:
-+  Range() : First(0), Last(0) {}
-+  Range(T first, T last) : First(first), Last(last) {}
-+
-+  bool operator==(const Range &other) const {
-+    return (empty() && other.empty()) ||
-+      (First == other.First && Last == other.Last);
-+  }
-+
-+  /// empty - Return whether the range is empty.
-+  bool empty() const {
-+    return Last <= First;
-+  }
-+
-+  /// getFirst - Return the value defining the start of the range.
-+  T getFirst() const {
-+    assert(!empty() && "An empty range has no starting value!");
-+    return First;
-+  }
-+
-+  /// getLast - Return the value defining the end of the range.
-+  T getLast() const {
-+    assert(!empty() && "An empty range has no ending value!");
-+    return Last;
-+  }
-+
-+  /// getWidth - Return the number of values in the range.
-+  T getWidth() const {
-+    return empty() ? 0 : Last - First;
-+  }
-+
-+  /// contains - Return true if the given range is contained in this one.
-+  bool contains(Range r) const {
-+    if (r.empty())
-+      return true;
-+    if (empty())
-+      return false;
-+    return First <= r.First && Last >= r.Last;
-+  }
-+
-+  /// intersects - Return true if the given range intersects this one.
-+  bool intersects(Range r) const {
-+    if (empty() || r.empty())
-+      return false;
-+    return r.First < Last && r.Last > First;
-+  }
-+
-+  /// Displace - Return the range obtained by adding the given offset.
-+  Range Displace(T Offset) const {
-+    if (empty())
-+      return Range();
-+    assert(((Offset >= 0 && First + Offset >= First && Last + Offset >= Last) ||
-+            (Offset < 0 && First + Offset < First && Last + Offset < Last)) &&
-+           "Displacement wrapped range!");
-+    return Range(First + Offset, Last + Offset);
-+  }
-+
-+  /// Join - Return the smallest range containing this range and the given one.
-+  Range Join(Range other) const {
-+    if (empty())
-+      return other;
-+    if (other.empty())
-+      return *this;
-+    return Range(First < other.First ? First : other.First,
-+                 Last > other.Last ? Last : other.Last);
-+  }
-+
-+  /// Meet - Return the intersection of this range and the given one.
-+  Range Meet(Range other) const {
-+    if (empty() || other.empty())
-+      return Range();
-+    return Range(First > other.First ? First : other.First,
-+                 Last < other.Last ? Last : other.Last);
-+  }
-+};
-+
-+#endif /* DRAGONEGG_RANGE_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/cache.h dragonegg-2.9-new/include/dragonegg/cache.h
---- dragonegg-2.9-old/include/dragonegg/cache.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/cache.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,45 @@
-+/*===----------- cache.h - Caching values "in" GCC trees ----------*- C -*-===*\
-+|*                                                                            *|
-+|* Copyright (C) 2009, 2010, 2011  Duncan Sands.                              *|
-+|*                                                                            *|
-+|* This file is part of DragonEgg.                                            *|
-+|*                                                                            *|
-+|* DragonEgg is free software; you can redistribute it and/or modify it under *|
-+|* the terms of the GNU General Public License as published by the Free       *|
-+|* Software Foundation; either version 2, or (at your option) any later       *|
-+|* version.                                                                   *|
-+|*                                                                            *|
-+|* DragonEgg is distributed in the hope that it will be useful, but WITHOUT   *|
-+|* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or      *|
-+|* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for  *|
-+|* more details.                                                              *|
-+|* You should have received a copy of the GNU General Public License along    *|
-+|* with DragonEgg; see the file COPYING.  If not, write to the Free Software  *|
-+|* Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.     *|
-+|*                                                                            *|
-+|*===----------------------------------------------------------------------===*|
-+|* This code lets you to associate a void* with a tree, as if it were cached  *|
-+|* inside the tree: if the tree is garbage collected and reallocated, then    *|
-+|* the cached value will have been cleared.                                   *|
-+\*===----------------------------------------------------------------------===*/
-+
-+#ifndef DRAGONEGG_CACHE_H
-+#define DRAGONEGG_CACHE_H
-+
-+union tree_node;
-+
-+/* llvm_has_cached - Returns whether a value has been associated with the
-+   tree.  */
-+extern int llvm_has_cached(union tree_node *tree);
-+
-+/* llvm_get_cached - Returns the value associated with the tree, or NULL.  */
-+extern const void *llvm_get_cached(union tree_node *tree);
-+
-+/* llvm_set_cached - Associates the given value with the tree (and returns it).
-+   To delete an association, pass NULL for the value.  */
-+extern const void *llvm_set_cached(union tree_node *tree, const void *val);
-+
-+/* llvm_replace_cached - Replaces all occurrences of old_val with new_val.  */
-+extern void llvm_replace_cached(const void *old_val, const void *new_val);
-+
-+#endif /* DRAGONEGG_CACHE_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/Constants.h dragonegg-2.9-new/include/dragonegg/Constants.h
---- dragonegg-2.9-old/include/dragonegg/Constants.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/Constants.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,60 @@
-+//=----- Constants.h - Converting and working with constants ------*- C++ -*-=//
-+//
-+// Copyright (C) 2011  Duncan Sands.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares functions for converting GCC constants to LLVM and working
-+// with them.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_CONSTANTS_H
-+#define DRAGONEGG_CONSTANTS_H
-+
-+// Forward declarations.
-+namespace llvm {
-+  class Constant;
-+  class Type;
-+}
-+union tree_node;
-+
-+/// AddressOf - Given an expression with a constant address such as a constant,
-+/// a global variable or a label, returns the address.  The type of the returned
-+/// is always a pointer type and, as long as 'exp' does not have void type, the
-+/// type of the pointee is the memory type that corresponds to the type of exp
-+/// (see ConvertType).
-+extern llvm::Constant *AddressOf(tree_node *exp);
-+
-+/// ConvertInitializer - Convert the initial value for a global variable to an
-+/// equivalent LLVM constant.  Also handles constant constructors.  The type of
-+/// the returned value may be pretty much anything.  All that is guaranteed is
-+/// that its alloc size is equal to the size of the initial value and that its
-+/// alignment is less than or equal to the initial value's GCC type alignment.
-+/// Note that the GCC type may have variable size or no size, in which case the
-+/// size is determined by the initial value.  When this happens the size of the
-+/// initial value may exceed the alloc size of the LLVM memory type generated
-+/// for the GCC type (see ConvertType); it is never smaller than the alloc size.
-+extern llvm::Constant *ConvertInitializer(tree_node *exp);
-+
-+/// InterpretAsType - Interpret the bits of the given constant (starting from
-+/// StartingBit) as representing a constant of type 'Ty'.  This results in the
-+/// same constant as you would get by storing the bits of 'C' to memory (with
-+/// the first bit stored being 'StartingBit') and then loading out a (constant)
-+/// value of type 'Ty' from the stored to memory location.
-+extern llvm::Constant *InterpretAsType(llvm::Constant *C, const llvm::Type* Ty,
-+                                       int StartingBit);
-+
-+#endif /* DRAGONEGG_CONSTANTS_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/Debug.h dragonegg-2.9-new/include/dragonegg/Debug.h
---- dragonegg-2.9-old/include/dragonegg/Debug.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/Debug.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,367 @@
-+//===------ Debug.h - Interface for generating debug info -------*- C++ -*-===//
-+//
-+// Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011  Jim Laskey, Duncan Sands
-+// et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares the debug interfaces shared among the dragonegg files.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_DEBUG_H
-+#define DRAGONEGG_DEBUG_H
-+
-+// Plugin headers
-+#include "dragonegg/Internals.h"
-+
-+// LLVM headers
-+#include "llvm/Analysis/DebugInfo.h"
-+#include "llvm/Support/Allocator.h"
-+#include "llvm/Support/ValueHandle.h"
-+
-+// System headers
-+#include <map>
-+
-+namespace llvm {
-+
-+// Forward declarations
-+class AllocaInst;
-+class BasicBlock;
-+class CallInst;
-+class Function;
-+class Module;
-+
-+/// DIFactory - This object assists with the construction of the various
-+/// descriptors.
-+class DIFactory {
-+  Module &M;
-+  LLVMContext& VMContext;
-+  
-+  Function *DeclareFn;     // llvm.dbg.declare
-+  Function *ValueFn;       // llvm.dbg.value
-+  
-+  DIFactory(const DIFactory &);     // DO NOT IMPLEMENT
-+  void operator=(const DIFactory&); // DO NOT IMPLEMENT
-+  public:
-+  enum ComplexAddrKind { OpPlus=1, OpDeref };
-+  
-+  explicit DIFactory(Module &m);
-+  
-+  /// GetOrCreateArray - Create an descriptor for an array of descriptors.
-+  /// This implicitly uniques the arrays created.
-+  DIArray GetOrCreateArray(DIDescriptor *Tys, unsigned NumTys);
-+  
-+  /// GetOrCreateSubrange - Create a descriptor for a value range.  This
-+  /// implicitly uniques the values returned.
-+  DISubrange GetOrCreateSubrange(int64_t Lo, int64_t Hi);
-+  
-+  /// CreateUnspecifiedParameter - Create unspeicified type descriptor
-+  /// for a subroutine type.
-+  DIDescriptor CreateUnspecifiedParameter();
-+  
-+  /// CreateCompileUnit - Create a new descriptor for the specified compile
-+  /// unit.
-+  DICompileUnit CreateCompileUnit(unsigned LangID,
-+                                  StringRef Filename,
-+                                  StringRef Directory,
-+                                  StringRef Producer,
-+                                  bool isMain = false,
-+                                  bool isOptimized = false,
-+                                  StringRef Flags = "",
-+                                  unsigned RunTimeVer = 0);
-+  
-+  /// CreateFile -  Create a new descriptor for the specified file.
-+  DIFile CreateFile(StringRef Filename, StringRef Directory,
-+                    DICompileUnit CU);
-+  
-+  /// CreateEnumerator - Create a single enumerator value.
-+  DIEnumerator CreateEnumerator(StringRef Name, uint64_t Val);
-+  
-+  /// CreateBasicType - Create a basic type like int, float, etc.
-+  DIBasicType CreateBasicType(DIDescriptor Context, StringRef Name,
-+                              DIFile F, unsigned LineNumber,
-+                              uint64_t SizeInBits, uint64_t AlignInBits,
-+                              uint64_t OffsetInBits, unsigned Flags,
-+                              unsigned Encoding);
-+  
-+  /// CreateBasicType - Create a basic type like int, float, etc.
-+  DIBasicType CreateBasicTypeEx(DIDescriptor Context, StringRef Name,
-+                                DIFile F, unsigned LineNumber,
-+                                Constant *SizeInBits, Constant *AlignInBits,
-+                                Constant *OffsetInBits, unsigned Flags,
-+                                unsigned Encoding);
-+  
-+  /// CreateDerivedType - Create a derived type like const qualified type,
-+  /// pointer, typedef, etc.
-+  DIDerivedType CreateDerivedType(unsigned Tag, DIDescriptor Context,
-+                                  StringRef Name,
-+                                  DIFile F,
-+                                  unsigned LineNumber,
-+                                  uint64_t SizeInBits, uint64_t AlignInBits,
-+                                  uint64_t OffsetInBits, unsigned Flags,
-+                                  DIType DerivedFrom);
-+  
-+  /// CreateDerivedType - Create a derived type like const qualified type,
-+  /// pointer, typedef, etc.
-+  DIDerivedType CreateDerivedTypeEx(unsigned Tag, DIDescriptor Context,
-+                                    StringRef Name,
-+                                    DIFile F,
-+                                    unsigned LineNumber,
-+                                    Constant *SizeInBits, 
-+                                    Constant *AlignInBits,
-+                                    Constant *OffsetInBits, unsigned Flags,
-+                                    DIType DerivedFrom);
-+  
-+  /// CreateCompositeType - Create a composite type like array, struct, etc.
-+  DICompositeType CreateCompositeType(unsigned Tag, DIDescriptor Context,
-+                                      StringRef Name,
-+                                      DIFile F,
-+                                      unsigned LineNumber,
-+                                      uint64_t SizeInBits,
-+                                      uint64_t AlignInBits,
-+                                      uint64_t OffsetInBits, unsigned Flags,
-+                                      DIType DerivedFrom,
-+                                      DIArray Elements,
-+                                      unsigned RunTimeLang = 0,
-+                                      MDNode *ContainingType = 0);
-+  
-+  /// CreateTemporaryType - Create a temporary forward-declared type.
-+  DIType CreateTemporaryType();
-+  DIType CreateTemporaryType(DIFile F);
-+  
-+  /// CreateArtificialType - Create a new DIType with "artificial" flag set.
-+  DIType CreateArtificialType(DIType Ty);
-+  
-+  /// CreateCompositeType - Create a composite type like array, struct, etc.
-+  DICompositeType CreateCompositeTypeEx(unsigned Tag, DIDescriptor Context,
-+                                        StringRef Name,
-+                                        DIFile F,
-+                                        unsigned LineNumber,
-+                                        Constant *SizeInBits,
-+                                        Constant *AlignInBits,
-+                                        Constant *OffsetInBits, 
-+                                        unsigned Flags,
-+                                        DIType DerivedFrom,
-+                                        DIArray Elements,
-+                                        unsigned RunTimeLang = 0,
-+                                        MDNode *ContainingType = 0);
-+  
-+  /// CreateSubprogram - Create a new descriptor for the specified subprogram.
-+  /// See comments in DISubprogram for descriptions of these fields.
-+  DISubprogram CreateSubprogram(DIDescriptor Context, StringRef Name,
-+                                StringRef DisplayName,
-+                                StringRef LinkageName,
-+                                DIFile F, unsigned LineNo,
-+                                DIType Ty, bool isLocalToUnit,
-+                                bool isDefinition,
-+                                unsigned VK = 0,
-+                                unsigned VIndex = 0,
-+                                DIType ContainingType = DIType(),
-+                                unsigned Flags = 0,
-+                                bool isOptimized = false,
-+                                Function *Fn = 0);
-+  
-+  /// CreateSubprogramDefinition - Create new subprogram descriptor for the
-+  /// given declaration. 
-+  DISubprogram CreateSubprogramDefinition(DISubprogram &SPDeclaration);
-+  
-+  /// CreateGlobalVariable - Create a new descriptor for the specified global.
-+  DIGlobalVariable
-+    CreateGlobalVariable(DIDescriptor Context, StringRef Name,
-+                         StringRef DisplayName,
-+                         StringRef LinkageName,
-+                         DIFile F,
-+                         unsigned LineNo, DIType Ty, bool isLocalToUnit,
-+                         bool isDefinition, llvm::GlobalVariable *GV);
-+  
-+  /// CreateGlobalVariable - Create a new descriptor for the specified constant.
-+  DIGlobalVariable
-+    CreateGlobalVariable(DIDescriptor Context, StringRef Name,
-+                         StringRef DisplayName,
-+                         StringRef LinkageName,
-+                         DIFile F,
-+                         unsigned LineNo, DIType Ty, bool isLocalToUnit,
-+                         bool isDefinition, llvm::Constant *C);
-+  
-+  /// CreateVariable - Create a new descriptor for the specified variable.
-+  DIVariable CreateVariable(unsigned Tag, DIDescriptor Context,
-+                            StringRef Name,
-+                            DIFile F, unsigned LineNo,
-+                            DIType Ty, bool AlwaysPreserve = false,
-+                            unsigned Flags = 0);
-+  
-+  /// CreateComplexVariable - Create a new descriptor for the specified
-+  /// variable which has a complex address expression for its address.
-+  DIVariable CreateComplexVariable(unsigned Tag, DIDescriptor Context,
-+                                   StringRef Name, DIFile F, unsigned LineNo,
-+                                   DIType Ty, Value *const *Addr,
-+                                   unsigned NumAddr);
-+  
-+  /// CreateLexicalBlock - This creates a descriptor for a lexical block
-+  /// with the specified parent context.
-+  DILexicalBlock CreateLexicalBlock(DIDescriptor Context, DIFile F,
-+                                    unsigned Line = 0, unsigned Col = 0);
-+  
-+  /// CreateNameSpace - This creates new descriptor for a namespace
-+  /// with the specified parent context.
-+  DINameSpace CreateNameSpace(DIDescriptor Context, StringRef Name,
-+                              DIFile F, unsigned LineNo);
-+  
-+  /// CreateLocation - Creates a debug info location.
-+  DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
-+                            DIScope S, DILocation OrigLoc);
-+  
-+  /// CreateLocation - Creates a debug info location.
-+  DILocation CreateLocation(unsigned LineNo, unsigned ColumnNo,
-+                              DIScope S, MDNode *OrigLoc = 0);
-+  
-+  /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
-+  Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
-+                             BasicBlock *InsertAtEnd);
-+  
-+  /// InsertDeclare - Insert a new llvm.dbg.declare intrinsic call.
-+  Instruction *InsertDeclare(llvm::Value *Storage, DIVariable D,
-+                             Instruction *InsertBefore);
-+  
-+  /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
-+  Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
-+                                       DIVariable D, BasicBlock *InsertAtEnd);
-+  
-+  /// InsertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
-+  Instruction *InsertDbgValueIntrinsic(llvm::Value *V, uint64_t Offset,
-+                                       DIVariable D, Instruction *InsertBefore);
-+  
-+  // RecordType - Record DIType in a module such that it is not lost even if
-+  // it is not referenced through debug info anchors.
-+  void RecordType(DIType T);
-+  
-+  private:
-+  Constant *GetTagConstant(unsigned TAG);
-+};
-+
-+/// DebugInfo - This class gathers all debug information during compilation and
-+/// is responsible for emitting to llvm globals or pass directly to the backend.
-+class DebugInfo {
-+private:
-+  Module *M;                            // The current module.
-+  DIFactory DebugFactory;
-+  const char *CurFullPath;              // Previous location file encountered.
-+  int CurLineNo;                        // Previous location line# encountered.
-+  const char *PrevFullPath;             // Previous location file encountered.
-+  int PrevLineNo;                       // Previous location line# encountered.
-+  BasicBlock *PrevBB;                   // Last basic block encountered.
-+
-+  DICompileUnit TheCU;                  // The compile unit.
-+
-+  std::map<tree_node *, WeakVH > TypeCache;
-+                                        // Cache of previously constructed
-+                                        // Types.
-+  std::map<tree_node *, WeakVH > SPCache;
-+                                        // Cache of previously constructed
-+                                        // Subprograms.
-+  std::map<tree_node *, WeakVH> NameSpaceCache;
-+                                        // Cache of previously constructed name
-+                                        // spaces.
-+
-+  SmallVector<WeakVH, 4> RegionStack;
-+                                        // Stack to track declarative scopes.
-+
-+  std::map<tree_node *, WeakVH> RegionMap;
-+
-+  /// FunctionNames - This is a storage for function names that are
-+  /// constructed on demand. For example, C++ destructors, C++ operators etc..
-+  llvm::BumpPtrAllocator FunctionNames;
-+
-+public:
-+  DebugInfo(Module *m);
-+
-+  /// Initialize - Initialize debug info by creating compile unit for
-+  /// main_input_filename. This must be invoked after language dependent
-+  /// initialization is done.
-+  void Initialize();
-+
-+  // Accessors.
-+  void setLocationFile(const char *FullPath) { CurFullPath = FullPath; }
-+  void setLocationLine(int LineNo)           { CurLineNo = LineNo; }
-+
-+  /// EmitFunctionStart - Constructs the debug code for entering a function -
-+  /// "llvm.dbg.func.start."
-+  void EmitFunctionStart(tree_node *FnDecl, Function *Fn);
-+
-+  /// EmitFunctionEnd - Constructs the debug code for exiting a declarative
-+  /// region - "llvm.dbg.region.end."
-+  void EmitFunctionEnd(bool EndFunction);
-+
-+  /// EmitDeclare - Constructs the debug code for allocation of a new variable.
-+  /// region - "llvm.dbg.declare."
-+  void EmitDeclare(tree_node *decl, unsigned Tag, const char *Name,
-+                   tree_node *type, Value *AI, LLVMBuilder &Builder);
-+
-+  /// EmitStopPoint - Emit a call to llvm.dbg.stoppoint to indicate a change of
-+  /// source line.
-+  void EmitStopPoint(BasicBlock *CurBB, LLVMBuilder &Builder);
-+
-+  /// EmitGlobalVariable - Emit information about a global variable.
-+  ///
-+  void EmitGlobalVariable(GlobalVariable *GV, tree_node *decl);
-+
-+  /// getOrCreateType - Get the type from the cache or create a new type if
-+  /// necessary.
-+  DIType getOrCreateType(tree_node *type);
-+
-+  /// createBasicType - Create BasicType.
-+  DIType createBasicType(tree_node *type);
-+
-+  /// createMethodType - Create MethodType.
-+  DIType createMethodType(tree_node *type);
-+
-+  /// createPointerType - Create PointerType.
-+  DIType createPointerType(tree_node *type);
-+
-+  /// createArrayType - Create ArrayType.
-+  DIType createArrayType(tree_node *type);
-+
-+  /// createEnumType - Create EnumType.
-+  DIType createEnumType(tree_node *type);
-+
-+  /// createStructType - Create StructType for struct or union or class.
-+  DIType createStructType(tree_node *type);
-+
-+  /// createVarinatType - Create variant type or return MainTy.
-+  DIType createVariantType(tree_node *type, DIType MainTy);
-+
-+  /// getOrCreateCompileUnit - Create a new compile unit.
-+  DICompileUnit getOrCreateCompileUnit(const char *FullPath,
-+                                       bool isMain = false);
-+
-+  /// getOrCreateFile - Get DIFile descriptor.
-+  DIFile getOrCreateFile(const char *FullPath);
-+
-+  /// findRegion - Find tree_node N's region.
-+  DIDescriptor findRegion(tree_node *n);
-+
-+  /// getOrCreateNameSpace - Get name space descriptor for the tree node.
-+  DINameSpace getOrCreateNameSpace(tree_node *Node, DIDescriptor Context);
-+
-+  /// getFunctionName - Get function name for the given FnDecl. If the
-+  /// name is constructred on demand (e.g. C++ destructor) then the name
-+  /// is stored on the side.
-+  StringRef getFunctionName(tree_node *FnDecl);
-+};
-+
-+} // end namespace llvm
-+
-+#endif /* DRAGONEGG_DEBUG_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/gt-cache.h dragonegg-2.9-new/include/dragonegg/gt-cache.h
---- dragonegg-2.9-old/include/dragonegg/gt-cache.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/gt-cache.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,802 @@
-+/* Type information for GCC.
-+   Copyright (C) 2004, 2007, 2009 Free Software Foundation, Inc.
-+
-+This file is part of GCC.
-+
-+GCC is free software; you can redistribute it and/or modify it under
-+the terms of the GNU General Public License as published by the Free
-+Software Foundation; either version 3, or (at your option) any later
-+version.
-+
-+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-+WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-+for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with GCC; see the file COPYING3.  If not see
-+<http://www.gnu.org/licenses/>.  */
-+
-+/* This file is machine generated.  Do not edit.  */
-+
-+/* GC marker procedures.  */
-+/* macros and declarations */
-+#define gt_ggc_m_13tree_llvm_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_llvm_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_llvm_map (void *);
-+#define gt_ggc_m_15interface_tuple(X) do { \
-+  if (X != NULL) gt_ggc_mx_interface_tuple (X);\
-+  } while (0)
-+extern void gt_ggc_mx_interface_tuple (void *);
-+#define gt_ggc_m_16volatilized_type(X) do { \
-+  if (X != NULL) gt_ggc_mx_volatilized_type (X);\
-+  } while (0)
-+extern void gt_ggc_mx_volatilized_type (void *);
-+#define gt_ggc_m_17string_descriptor(X) do { \
-+  if (X != NULL) gt_ggc_mx_string_descriptor (X);\
-+  } while (0)
-+extern void gt_ggc_mx_string_descriptor (void *);
-+#define gt_ggc_m_15c_inline_static(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_inline_static (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_inline_static (void *);
-+#define gt_ggc_m_24VEC_c_goto_bindings_p_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_c_goto_bindings_p_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_c_goto_bindings_p_gc (void *);
-+#define gt_ggc_m_15c_goto_bindings(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_goto_bindings (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_goto_bindings (void *);
-+#define gt_ggc_m_7c_scope(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_scope (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_scope (void *);
-+#define gt_ggc_m_9c_binding(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_binding (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_binding (void *);
-+#define gt_ggc_m_12c_label_vars(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_label_vars (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_label_vars (void *);
-+#define gt_ggc_m_8c_parser(X) do { \
-+  if (X != NULL) gt_ggc_mx_c_parser (X);\
-+  } while (0)
-+extern void gt_ggc_mx_c_parser (void *);
-+#define gt_ggc_m_9imp_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_imp_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_imp_entry (void *);
-+#define gt_ggc_m_16hashed_attribute(X) do { \
-+  if (X != NULL) gt_ggc_mx_hashed_attribute (X);\
-+  } while (0)
-+extern void gt_ggc_mx_hashed_attribute (void *);
-+#define gt_ggc_m_12hashed_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_hashed_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_hashed_entry (void *);
-+#define gt_ggc_m_14type_assertion(X) do { \
-+  if (X != NULL) gt_ggc_mx_type_assertion (X);\
-+  } while (0)
-+extern void gt_ggc_mx_type_assertion (void *);
-+#define gt_ggc_m_18treetreehash_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_treetreehash_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_treetreehash_entry (void *);
-+#define gt_ggc_m_5CPool(X) do { \
-+  if (X != NULL) gt_ggc_mx_CPool (X);\
-+  } while (0)
-+extern void gt_ggc_mx_CPool (void *);
-+#define gt_ggc_m_3JCF(X) do { \
-+  if (X != NULL) gt_ggc_mx_JCF (X);\
-+  } while (0)
-+extern void gt_ggc_mx_JCF (void *);
-+#define gt_ggc_m_17module_htab_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_module_htab_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_module_htab_entry (void *);
-+#define gt_ggc_m_13binding_level(X) do { \
-+  if (X != NULL) gt_ggc_mx_binding_level (X);\
-+  } while (0)
-+extern void gt_ggc_mx_binding_level (void *);
-+#define gt_ggc_m_9opt_stack(X) do { \
-+  if (X != NULL) gt_ggc_mx_opt_stack (X);\
-+  } while (0)
-+extern void gt_ggc_mx_opt_stack (void *);
-+#define gt_ggc_m_16def_pragma_macro(X) do { \
-+  if (X != NULL) gt_ggc_mx_def_pragma_macro (X);\
-+  } while (0)
-+extern void gt_ggc_mx_def_pragma_macro (void *);
-+#define gt_ggc_m_22def_pragma_macro_value(X) do { \
-+  if (X != NULL) gt_ggc_mx_def_pragma_macro_value (X);\
-+  } while (0)
-+extern void gt_ggc_mx_def_pragma_macro_value (void *);
-+#define gt_ggc_m_11align_stack(X) do { \
-+  if (X != NULL) gt_ggc_mx_align_stack (X);\
-+  } while (0)
-+extern void gt_ggc_mx_align_stack (void *);
-+#define gt_ggc_m_18VEC_tree_gc_vec_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_tree_gc_vec_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_tree_gc_vec_gc (void *);
-+#define gt_ggc_m_19VEC_const_char_p_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_const_char_p_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_const_char_p_gc (void *);
-+#define gt_ggc_m_21pending_abstract_type(X) do { \
-+  if (X != NULL) gt_ggc_mx_pending_abstract_type (X);\
-+  } while (0)
-+extern void gt_ggc_mx_pending_abstract_type (void *);
-+#define gt_ggc_m_15VEC_tree_int_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_tree_int_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_tree_int_gc (void *);
-+#define gt_ggc_m_9cp_parser(X) do { \
-+  if (X != NULL) gt_ggc_mx_cp_parser (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cp_parser (void *);
-+#define gt_ggc_m_17cp_parser_context(X) do { \
-+  if (X != NULL) gt_ggc_mx_cp_parser_context (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cp_parser_context (void *);
-+#define gt_ggc_m_8cp_lexer(X) do { \
-+  if (X != NULL) gt_ggc_mx_cp_lexer (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cp_lexer (void *);
-+#define gt_ggc_m_10tree_check(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_check (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_check (void *);
-+#define gt_ggc_m_22VEC_deferred_access_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_deferred_access_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_deferred_access_gc (void *);
-+#define gt_ggc_m_10spec_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_spec_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_spec_entry (void *);
-+#define gt_ggc_m_16pending_template(X) do { \
-+  if (X != NULL) gt_ggc_mx_pending_template (X);\
-+  } while (0)
-+extern void gt_ggc_mx_pending_template (void *);
-+#define gt_ggc_m_21named_label_use_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_named_label_use_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_named_label_use_entry (void *);
-+#define gt_ggc_m_28VEC_deferred_access_check_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_deferred_access_check_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_deferred_access_check_gc (void *);
-+#define gt_ggc_m_11tinst_level(X) do { \
-+  if (X != NULL) gt_ggc_mx_tinst_level (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tinst_level (void *);
-+#define gt_ggc_m_18sorted_fields_type(X) do { \
-+  if (X != NULL) gt_ggc_mx_sorted_fields_type (X);\
-+  } while (0)
-+extern void gt_ggc_mx_sorted_fields_type (void *);
-+#define gt_ggc_m_18VEC_tree_pair_s_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_tree_pair_s_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_tree_pair_s_gc (void *);
-+#define gt_ggc_m_17named_label_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_named_label_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_named_label_entry (void *);
-+#define gt_ggc_m_14cp_token_cache(X) do { \
-+  if (X != NULL) gt_ggc_mx_cp_token_cache (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cp_token_cache (void *);
-+#define gt_ggc_m_11saved_scope(X) do { \
-+  if (X != NULL) gt_ggc_mx_saved_scope (X);\
-+  } while (0)
-+extern void gt_ggc_mx_saved_scope (void *);
-+#define gt_ggc_m_16cxx_int_tree_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_cxx_int_tree_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cxx_int_tree_map (void *);
-+#define gt_ggc_m_23VEC_cp_class_binding_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_cp_class_binding_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_cp_class_binding_gc (void *);
-+#define gt_ggc_m_24VEC_cxx_saved_binding_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_cxx_saved_binding_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_cxx_saved_binding_gc (void *);
-+#define gt_ggc_m_16cp_binding_level(X) do { \
-+  if (X != NULL) gt_ggc_mx_cp_binding_level (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cp_binding_level (void *);
-+#define gt_ggc_m_11cxx_binding(X) do { \
-+  if (X != NULL) gt_ggc_mx_cxx_binding (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cxx_binding (void *);
-+#define gt_ggc_m_15binding_entry_s(X) do { \
-+  if (X != NULL) gt_ggc_mx_binding_entry_s (X);\
-+  } while (0)
-+extern void gt_ggc_mx_binding_entry_s (void *);
-+#define gt_ggc_m_15binding_table_s(X) do { \
-+  if (X != NULL) gt_ggc_mx_binding_table_s (X);\
-+  } while (0)
-+extern void gt_ggc_mx_binding_table_s (void *);
-+#define gt_ggc_m_14VEC_tinfo_s_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_tinfo_s_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_tinfo_s_gc (void *);
-+#define gt_ggc_m_18gnat_binding_level(X) do { \
-+  if (X != NULL) gt_ggc_mx_gnat_binding_level (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gnat_binding_level (void *);
-+#define gt_ggc_m_9elab_info(X) do { \
-+  if (X != NULL) gt_ggc_mx_elab_info (X);\
-+  } while (0)
-+extern void gt_ggc_mx_elab_info (void *);
-+#define gt_ggc_m_10stmt_group(X) do { \
-+  if (X != NULL) gt_ggc_mx_stmt_group (X);\
-+  } while (0)
-+extern void gt_ggc_mx_stmt_group (void *);
-+#define gt_ggc_m_16VEC_parm_attr_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_parm_attr_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_parm_attr_gc (void *);
-+#define gt_ggc_m_11parm_attr_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_parm_attr_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_parm_attr_d (void *);
-+#define gt_ggc_m_22VEC_ipa_edge_args_t_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_ipa_edge_args_t_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_ipa_edge_args_t_gc (void *);
-+#define gt_ggc_m_20lto_symtab_entry_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_lto_symtab_entry_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_lto_symtab_entry_def (void *);
-+#define gt_ggc_m_20ssa_operand_memory_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_ssa_operand_memory_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_ssa_operand_memory_d (void *);
-+#define gt_ggc_m_13scev_info_str(X) do { \
-+  if (X != NULL) gt_ggc_mx_scev_info_str (X);\
-+  } while (0)
-+extern void gt_ggc_mx_scev_info_str (void *);
-+#define gt_ggc_m_13VEC_gimple_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_gimple_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_gimple_gc (void *);
-+#define gt_ggc_m_9type_hash(X) do { \
-+  if (X != NULL) gt_ggc_mx_type_hash (X);\
-+  } while (0)
-+extern void gt_ggc_mx_type_hash (void *);
-+#define gt_ggc_m_16string_pool_data(X) do { \
-+  if (X != NULL) gt_ggc_mx_string_pool_data (X);\
-+  } while (0)
-+extern void gt_ggc_mx_string_pool_data (void *);
-+#define gt_ggc_m_13libfunc_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_libfunc_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_libfunc_entry (void *);
-+#define gt_ggc_m_23temp_slot_address_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_temp_slot_address_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_temp_slot_address_entry (void *);
-+#define gt_ggc_m_15throw_stmt_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_throw_stmt_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_throw_stmt_node (void *);
-+#define gt_ggc_m_21VEC_eh_landing_pad_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_eh_landing_pad_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_eh_landing_pad_gc (void *);
-+#define gt_ggc_m_16VEC_eh_region_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_eh_region_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_eh_region_gc (void *);
-+#define gt_ggc_m_10eh_catch_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_eh_catch_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_eh_catch_d (void *);
-+#define gt_ggc_m_16eh_landing_pad_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_eh_landing_pad_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_eh_landing_pad_d (void *);
-+#define gt_ggc_m_11eh_region_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_eh_region_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_eh_region_d (void *);
-+#define gt_ggc_m_10vcall_insn(X) do { \
-+  if (X != NULL) gt_ggc_mx_vcall_insn (X);\
-+  } while (0)
-+extern void gt_ggc_mx_vcall_insn (void *);
-+#define gt_ggc_m_18VEC_vcall_entry_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_vcall_entry_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_vcall_entry_gc (void *);
-+#define gt_ggc_m_18VEC_dcall_entry_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_dcall_entry_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_dcall_entry_gc (void *);
-+#define gt_ggc_m_16var_loc_list_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_var_loc_list_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_var_loc_list_def (void *);
-+#define gt_ggc_m_12var_loc_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_var_loc_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_var_loc_node (void *);
-+#define gt_ggc_m_20VEC_die_arg_entry_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_die_arg_entry_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_die_arg_entry_gc (void *);
-+#define gt_ggc_m_16limbo_die_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_limbo_die_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_limbo_die_struct (void *);
-+#define gt_ggc_m_20VEC_pubname_entry_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_pubname_entry_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_pubname_entry_gc (void *);
-+#define gt_ggc_m_19VEC_dw_attr_node_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_dw_attr_node_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_dw_attr_node_gc (void *);
-+#define gt_ggc_m_18comdat_type_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_comdat_type_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_comdat_type_struct (void *);
-+#define gt_ggc_m_25dw_ranges_by_label_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_ranges_by_label_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_ranges_by_label_struct (void *);
-+#define gt_ggc_m_16dw_ranges_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_ranges_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_ranges_struct (void *);
-+#define gt_ggc_m_28dw_separate_line_info_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_separate_line_info_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_separate_line_info_struct (void *);
-+#define gt_ggc_m_19dw_line_info_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_line_info_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_line_info_struct (void *);
-+#define gt_ggc_m_25VEC_deferred_locations_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_deferred_locations_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_deferred_locations_gc (void *);
-+#define gt_ggc_m_18dw_loc_list_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_loc_list_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_loc_list_struct (void *);
-+#define gt_ggc_m_15dwarf_file_data(X) do { \
-+  if (X != NULL) gt_ggc_mx_dwarf_file_data (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dwarf_file_data (void *);
-+#define gt_ggc_m_15queued_reg_save(X) do { \
-+  if (X != NULL) gt_ggc_mx_queued_reg_save (X);\
-+  } while (0)
-+extern void gt_ggc_mx_queued_reg_save (void *);
-+#define gt_ggc_m_20indirect_string_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_indirect_string_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_indirect_string_node (void *);
-+#define gt_ggc_m_19dw_loc_descr_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_loc_descr_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_loc_descr_struct (void *);
-+#define gt_ggc_m_13dw_fde_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_fde_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_fde_struct (void *);
-+#define gt_ggc_m_13dw_cfi_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_dw_cfi_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_dw_cfi_struct (void *);
-+#define gt_ggc_m_8typeinfo(X) do { \
-+  if (X != NULL) gt_ggc_mx_typeinfo (X);\
-+  } while (0)
-+extern void gt_ggc_mx_typeinfo (void *);
-+#define gt_ggc_m_22VEC_alias_set_entry_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_alias_set_entry_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_alias_set_entry_gc (void *);
-+#define gt_ggc_m_17alias_set_entry_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_alias_set_entry_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_alias_set_entry_d (void *);
-+#define gt_ggc_m_24constant_descriptor_tree(X) do { \
-+  if (X != NULL) gt_ggc_mx_constant_descriptor_tree (X);\
-+  } while (0)
-+extern void gt_ggc_mx_constant_descriptor_tree (void *);
-+#define gt_ggc_m_15cgraph_asm_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_cgraph_asm_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cgraph_asm_node (void *);
-+#define gt_ggc_m_12varpool_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_varpool_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_varpool_node (void *);
-+#define gt_ggc_m_22VEC_cgraph_node_set_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_cgraph_node_set_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_cgraph_node_set_gc (void *);
-+#define gt_ggc_m_19cgraph_node_set_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_cgraph_node_set_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cgraph_node_set_def (void *);
-+#define gt_ggc_m_27cgraph_node_set_element_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_cgraph_node_set_element_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cgraph_node_set_element_def (void *);
-+#define gt_ggc_m_22VEC_cgraph_node_ptr_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_cgraph_node_ptr_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_cgraph_node_ptr_gc (void *);
-+#define gt_ggc_m_11cgraph_edge(X) do { \
-+  if (X != NULL) gt_ggc_mx_cgraph_edge (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cgraph_edge (void *);
-+#define gt_ggc_m_24VEC_ipa_replace_map_p_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_ipa_replace_map_p_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_ipa_replace_map_p_gc (void *);
-+#define gt_ggc_m_15ipa_replace_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_ipa_replace_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_ipa_replace_map (void *);
-+#define gt_ggc_m_11cgraph_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_cgraph_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cgraph_node (void *);
-+#define gt_ggc_m_18VEC_basic_block_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_basic_block_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_basic_block_gc (void *);
-+#define gt_ggc_m_14gimple_bb_info(X) do { \
-+  if (X != NULL) gt_ggc_mx_gimple_bb_info (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gimple_bb_info (void *);
-+#define gt_ggc_m_11rtl_bb_info(X) do { \
-+  if (X != NULL) gt_ggc_mx_rtl_bb_info (X);\
-+  } while (0)
-+extern void gt_ggc_mx_rtl_bb_info (void *);
-+#define gt_ggc_m_11VEC_edge_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_edge_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_edge_gc (void *);
-+#define gt_ggc_m_17cselib_val_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_cselib_val_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cselib_val_struct (void *);
-+#define gt_ggc_m_12elt_loc_list(X) do { \
-+  if (X != NULL) gt_ggc_mx_elt_loc_list (X);\
-+  } while (0)
-+extern void gt_ggc_mx_elt_loc_list (void *);
-+#define gt_ggc_m_13VEC_loop_p_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_loop_p_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_loop_p_gc (void *);
-+#define gt_ggc_m_4loop(X) do { \
-+  if (X != NULL) gt_ggc_mx_loop (X);\
-+  } while (0)
-+extern void gt_ggc_mx_loop (void *);
-+#define gt_ggc_m_9loop_exit(X) do { \
-+  if (X != NULL) gt_ggc_mx_loop_exit (X);\
-+  } while (0)
-+extern void gt_ggc_mx_loop_exit (void *);
-+#define gt_ggc_m_13nb_iter_bound(X) do { \
-+  if (X != NULL) gt_ggc_mx_nb_iter_bound (X);\
-+  } while (0)
-+extern void gt_ggc_mx_nb_iter_bound (void *);
-+#define gt_ggc_m_24types_used_by_vars_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_types_used_by_vars_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_types_used_by_vars_entry (void *);
-+#define gt_ggc_m_17language_function(X) do { \
-+  if (X != NULL) gt_ggc_mx_language_function (X);\
-+  } while (0)
-+extern void gt_ggc_mx_language_function (void *);
-+#define gt_ggc_m_5loops(X) do { \
-+  if (X != NULL) gt_ggc_mx_loops (X);\
-+  } while (0)
-+extern void gt_ggc_mx_loops (void *);
-+#define gt_ggc_m_18control_flow_graph(X) do { \
-+  if (X != NULL) gt_ggc_mx_control_flow_graph (X);\
-+  } while (0)
-+extern void gt_ggc_mx_control_flow_graph (void *);
-+#define gt_ggc_m_9eh_status(X) do { \
-+  if (X != NULL) gt_ggc_mx_eh_status (X);\
-+  } while (0)
-+extern void gt_ggc_mx_eh_status (void *);
-+#define gt_ggc_m_20initial_value_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_initial_value_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_initial_value_struct (void *);
-+#define gt_ggc_m_17rtx_constant_pool(X) do { \
-+  if (X != NULL) gt_ggc_mx_rtx_constant_pool (X);\
-+  } while (0)
-+extern void gt_ggc_mx_rtx_constant_pool (void *);
-+#define gt_ggc_m_18VEC_temp_slot_p_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_temp_slot_p_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_temp_slot_p_gc (void *);
-+#define gt_ggc_m_9temp_slot(X) do { \
-+  if (X != NULL) gt_ggc_mx_temp_slot (X);\
-+  } while (0)
-+extern void gt_ggc_mx_temp_slot (void *);
-+#define gt_ggc_m_9gimple_df(X) do { \
-+  if (X != NULL) gt_ggc_mx_gimple_df (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gimple_df (void *);
-+#define gt_ggc_m_23VEC_call_site_record_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_call_site_record_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_call_site_record_gc (void *);
-+#define gt_ggc_m_18call_site_record_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_call_site_record_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_call_site_record_d (void *);
-+#define gt_ggc_m_14sequence_stack(X) do { \
-+  if (X != NULL) gt_ggc_mx_sequence_stack (X);\
-+  } while (0)
-+extern void gt_ggc_mx_sequence_stack (void *);
-+#define gt_ggc_m_8elt_list(X) do { \
-+  if (X != NULL) gt_ggc_mx_elt_list (X);\
-+  } while (0)
-+extern void gt_ggc_mx_elt_list (void *);
-+#define gt_ggc_m_17tree_priority_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_priority_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_priority_map (void *);
-+#define gt_ggc_m_12tree_int_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_int_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_int_map (void *);
-+#define gt_ggc_m_8tree_map(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_map (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_map (void *);
-+#define gt_ggc_m_14lang_tree_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_lang_tree_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_lang_tree_node (void *);
-+#define gt_ggc_m_24tree_statement_list_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_statement_list_node (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_statement_list_node (void *);
-+#define gt_ggc_m_9lang_decl(X) do { \
-+  if (X != NULL) gt_ggc_mx_lang_decl (X);\
-+  } while (0)
-+extern void gt_ggc_mx_lang_decl (void *);
-+#define gt_ggc_m_9lang_type(X) do { \
-+  if (X != NULL) gt_ggc_mx_lang_type (X);\
-+  } while (0)
-+extern void gt_ggc_mx_lang_type (void *);
-+#define gt_ggc_m_10die_struct(X) do { \
-+  if (X != NULL) gt_ggc_mx_die_struct (X);\
-+  } while (0)
-+extern void gt_ggc_mx_die_struct (void *);
-+#define gt_ggc_m_15varray_head_tag(X) do { \
-+  if (X != NULL) gt_ggc_mx_varray_head_tag (X);\
-+  } while (0)
-+extern void gt_ggc_mx_varray_head_tag (void *);
-+#define gt_ggc_m_12ptr_info_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_ptr_info_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_ptr_info_def (void *);
-+#define gt_ggc_m_22VEC_constructor_elt_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_constructor_elt_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_constructor_elt_gc (void *);
-+#define gt_ggc_m_10tree_ann_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_ann_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_tree_ann_d (void *);
-+#define gt_ggc_m_17VEC_alias_pair_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_alias_pair_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_alias_pair_gc (void *);
-+#define gt_ggc_m_11VEC_tree_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_tree_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_tree_gc (void *);
-+#define gt_ggc_m_12VEC_uchar_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_uchar_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_uchar_gc (void *);
-+#define gt_ggc_m_8function(X) do { \
-+  if (X != NULL) gt_ggc_mx_function (X);\
-+  } while (0)
-+extern void gt_ggc_mx_function (void *);
-+#define gt_ggc_m_23constant_descriptor_rtx(X) do { \
-+  if (X != NULL) gt_ggc_mx_constant_descriptor_rtx (X);\
-+  } while (0)
-+extern void gt_ggc_mx_constant_descriptor_rtx (void *);
-+#define gt_ggc_m_11fixed_value(X) do { \
-+  if (X != NULL) gt_ggc_mx_fixed_value (X);\
-+  } while (0)
-+extern void gt_ggc_mx_fixed_value (void *);
-+#define gt_ggc_m_10real_value(X) do { \
-+  if (X != NULL) gt_ggc_mx_real_value (X);\
-+  } while (0)
-+extern void gt_ggc_mx_real_value (void *);
-+#define gt_ggc_m_10VEC_rtx_gc(X) do { \
-+  if (X != NULL) gt_ggc_mx_VEC_rtx_gc (X);\
-+  } while (0)
-+extern void gt_ggc_mx_VEC_rtx_gc (void *);
-+#define gt_ggc_m_12object_block(X) do { \
-+  if (X != NULL) gt_ggc_mx_object_block (X);\
-+  } while (0)
-+extern void gt_ggc_mx_object_block (void *);
-+#define gt_ggc_m_9reg_attrs(X) do { \
-+  if (X != NULL) gt_ggc_mx_reg_attrs (X);\
-+  } while (0)
-+extern void gt_ggc_mx_reg_attrs (void *);
-+#define gt_ggc_m_9mem_attrs(X) do { \
-+  if (X != NULL) gt_ggc_mx_mem_attrs (X);\
-+  } while (0)
-+extern void gt_ggc_mx_mem_attrs (void *);
-+#define gt_ggc_m_14bitmap_obstack(X) do { \
-+  if (X != NULL) gt_ggc_mx_bitmap_obstack (X);\
-+  } while (0)
-+extern void gt_ggc_mx_bitmap_obstack (void *);
-+#define gt_ggc_m_18bitmap_element_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_bitmap_element_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_bitmap_element_def (void *);
-+#define gt_ggc_m_16machine_function(X) do { \
-+  if (X != NULL) gt_ggc_mx_machine_function (X);\
-+  } while (0)
-+extern void gt_ggc_mx_machine_function (void *);
-+#define gt_ggc_m_17stack_local_entry(X) do { \
-+  if (X != NULL) gt_ggc_mx_stack_local_entry (X);\
-+  } while (0)
-+extern void gt_ggc_mx_stack_local_entry (void *);
-+#define gt_ggc_m_15basic_block_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_basic_block_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_basic_block_def (void *);
-+#define gt_ggc_m_8edge_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_edge_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_edge_def (void *);
-+#define gt_ggc_m_17gimple_seq_node_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_gimple_seq_node_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gimple_seq_node_d (void *);
-+#define gt_ggc_m_12gimple_seq_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_gimple_seq_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gimple_seq_d (void *);
-+#define gt_ggc_m_7section(X) do { \
-+  if (X != NULL) gt_ggc_mx_section (X);\
-+  } while (0)
-+extern void gt_ggc_mx_section (void *);
-+#define gt_ggc_m_18gimple_statement_d(X) do { \
-+  if (X != NULL) gt_ggc_mx_gimple_statement_d (X);\
-+  } while (0)
-+extern void gt_ggc_mx_gimple_statement_d (void *);
-+#define gt_ggc_m_9rtvec_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_rtvec_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_rtvec_def (void *);
-+#define gt_ggc_m_7rtx_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_rtx_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_rtx_def (void *);
-+#define gt_ggc_m_15bitmap_head_def(X) do { \
-+  if (X != NULL) gt_ggc_mx_bitmap_head_def (X);\
-+  } while (0)
-+extern void gt_ggc_mx_bitmap_head_def (void *);
-+#define gt_ggc_m_9tree_node(X) do { \
-+  if (X != NULL) gt_ggc_mx_tree_node (X);\
-+  } while (0)
-+#define gt_ggc_mx_tree_node gt_ggc_mx_lang_tree_node
-+#define gt_ggc_m_6answer(X) do { \
-+  if (X != NULL) gt_ggc_mx_answer (X);\
-+  } while (0)
-+extern void gt_ggc_mx_answer (void *);
-+#define gt_ggc_m_9cpp_macro(X) do { \
-+  if (X != NULL) gt_ggc_mx_cpp_macro (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cpp_macro (void *);
-+#define gt_ggc_m_9cpp_token(X) do { \
-+  if (X != NULL) gt_ggc_mx_cpp_token (X);\
-+  } while (0)
-+extern void gt_ggc_mx_cpp_token (void *);
-+#define gt_ggc_m_9line_maps(X) do { \
-+  if (X != NULL) gt_ggc_mx_line_maps (X);\
-+  } while (0)
-+extern void gt_ggc_mx_line_maps (void *);
-+extern void gt_ggc_m_II17splay_tree_node_s (void *);
-+extern void gt_ggc_m_SP9tree_node17splay_tree_node_s (void *);
-+extern void gt_ggc_m_P9tree_nodeP9tree_node17splay_tree_node_s (void *);
-+extern void gt_ggc_m_IP9tree_node17splay_tree_node_s (void *);
-+extern void gt_ggc_m_P13tree_llvm_map4htab (void *);
-+extern void gt_ggc_m_P15interface_tuple4htab (void *);
-+extern void gt_ggc_m_P16volatilized_type4htab (void *);
-+extern void gt_ggc_m_P17string_descriptor4htab (void *);
-+extern void gt_ggc_m_P14type_assertion4htab (void *);
-+extern void gt_ggc_m_P18treetreehash_entry4htab (void *);
-+extern void gt_ggc_m_P17module_htab_entry4htab (void *);
-+extern void gt_ggc_m_P16def_pragma_macro4htab (void *);
-+extern void gt_ggc_m_P21pending_abstract_type4htab (void *);
-+extern void gt_ggc_m_P10spec_entry4htab (void *);
-+extern void gt_ggc_m_P16cxx_int_tree_map4htab (void *);
-+extern void gt_ggc_m_P17named_label_entry4htab (void *);
-+extern void gt_ggc_m_P12tree_int_map4htab (void *);
-+extern void gt_ggc_m_P20lto_symtab_entry_def4htab (void *);
-+extern void gt_ggc_m_IP9tree_node12splay_tree_s (void *);
-+extern void gt_ggc_m_P9tree_nodeP9tree_node12splay_tree_s (void *);
-+extern void gt_ggc_m_P12varpool_node4htab (void *);
-+extern void gt_ggc_m_P13scev_info_str4htab (void *);
-+extern void gt_ggc_m_P23constant_descriptor_rtx4htab (void *);
-+extern void gt_ggc_m_P24constant_descriptor_tree4htab (void *);
-+extern void gt_ggc_m_P12object_block4htab (void *);
-+extern void gt_ggc_m_P7section4htab (void *);
-+extern void gt_ggc_m_P17tree_priority_map4htab (void *);
-+extern void gt_ggc_m_P8tree_map4htab (void *);
-+extern void gt_ggc_m_P9type_hash4htab (void *);
-+extern void gt_ggc_m_P13libfunc_entry4htab (void *);
-+extern void gt_ggc_m_P23temp_slot_address_entry4htab (void *);
-+extern void gt_ggc_m_P15throw_stmt_node4htab (void *);
-+extern void gt_ggc_m_P9reg_attrs4htab (void *);
-+extern void gt_ggc_m_P9mem_attrs4htab (void *);
-+extern void gt_ggc_m_P7rtx_def4htab (void *);
-+extern void gt_ggc_m_SP9tree_node12splay_tree_s (void *);
-+extern void gt_ggc_m_P10vcall_insn4htab (void *);
-+extern void gt_ggc_m_P16var_loc_list_def4htab (void *);
-+extern void gt_ggc_m_P10die_struct4htab (void *);
-+extern void gt_ggc_m_P15dwarf_file_data4htab (void *);
-+extern void gt_ggc_m_P20indirect_string_node4htab (void *);
-+extern void gt_ggc_m_P11cgraph_node4htab (void *);
-+extern void gt_ggc_m_II12splay_tree_s (void *);
-+extern void gt_ggc_m_P27cgraph_node_set_element_def4htab (void *);
-+extern void gt_ggc_m_P11cgraph_edge4htab (void *);
-+extern void gt_ggc_m_P9loop_exit4htab (void *);
-+extern void gt_ggc_m_P24types_used_by_vars_entry4htab (void *);
-+extern void gt_ggc_m_P9tree_node4htab (void *);
-+
-+/* functions code */
-+
-+void
-+gt_ggc_mx_tree_llvm_map (void *x_p)
-+{
-+  struct tree_llvm_map * const x = (struct tree_llvm_map *)x_p;
-+  if (ggc_test_and_set_mark (x))
-+    {
-+      gt_ggc_m_9tree_node ((*x).base.from);
-+    }
-+}
-+
-+void
-+gt_ggc_m_P13tree_llvm_map4htab (void *x_p)
-+{
-+  struct htab * const x = (struct htab *)x_p;
-+  if (ggc_test_and_set_mark (x))
-+    {
-+      if ((*x).entries != NULL) {
-+        size_t i0;
-+        for (i0 = 0; i0 != (size_t)(((*x)).size); i0++) {
-+          gt_ggc_m_13tree_llvm_map ((*x).entries[i0]);
-+        }
-+        ggc_mark ((*x).entries);
-+      }
-+    }
-+}
-+
-+/* GC roots.  */
-+
-+EXPORTED_CONST struct ggc_cache_tab gt_ggc_rc__gt_llvm_cache_h[] = {
-+  {
-+    &llvm_cache,
-+    1,
-+    sizeof (llvm_cache),
-+    &gt_ggc_mx_tree_llvm_map,
-+    NULL,
-+    &tree_llvm_map_marked_p
-+  },
-+  LAST_GGC_CACHE_TAB
-+};
-+
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/Internals.h dragonegg-2.9-new/include/dragonegg/Internals.h
---- dragonegg-2.9-old/include/dragonegg/Internals.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/Internals.h	2011-04-09 00:38:28.299623547 +0200
-@@ -0,0 +1,866 @@
-+//=---- Internals.h - Interface between the backend components ----*- C++ -*-=//
-+//
-+// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011  Chris Lattner,
-+// Duncan Sands et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares the internal interfaces shared among the dragonegg files.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_INTERNALS_H
-+#define DRAGONEGG_INTERNALS_H
-+
-+// LLVM headers
-+#include "llvm/Intrinsics.h"
-+#include "llvm/ADT/DenseMap.h"
-+#include "llvm/ADT/SetVector.h"
-+#include "llvm/Support/IRBuilder.h"
-+#include "llvm/Support/TargetFolder.h"
-+
-+struct basic_block_def;
-+union gimple_statement_d;
-+union tree_node;
-+
-+namespace llvm {
-+  class Module;
-+  class GlobalVariable;
-+  class Function;
-+  class GlobalValue;
-+  class BasicBlock;
-+  class Instruction;
-+  class AllocaInst;
-+  class BranchInst;
-+  class Value;
-+  class Constant;
-+  class ConstantInt;
-+  class Type;
-+  class FunctionType;
-+  class TargetMachine;
-+  class DataLayout;
-+  class DebugInfo;
-+  template<typename> class AssertingVH;
-+  template<typename> class TrackingVH;
-+}
-+using namespace llvm;
-+
-+typedef IRBuilder<true, TargetFolder> LLVMBuilder;
-+
-+// Global state.
-+
-+/// TheModule - This is the current global module that we are compiling into.
-+///
-+extern llvm::Module *TheModule;
-+
-+/// TheDebugInfo - This object is responsible for gather all debug information.
-+/// If it's value is NULL then no debug information should be gathered.
-+extern llvm::DebugInfo *TheDebugInfo;
-+
-+/// TheTarget - The current target being compiled for.
-+///
-+extern llvm::TargetMachine *TheTarget;
-+
-+/// TheFolder - The constant folder to use.
-+extern TargetFolder *TheFolder;
-+
-+/// getDataLayout - Return the current DataLayout object from TheTarget.
-+const DataLayout &getDataLayout();
-+
-+/// flag_default_initialize_globals - Whether global variables with no explicit
-+/// initial value should be zero initialized.
-+extern bool flag_default_initialize_globals;
-+
-+/// flag_odr - Whether the language being compiled obeys the One Definition Rule
-+/// (i.e. if the same function is defined in multiple compilation units, all the
-+/// definitions are equivalent).
-+extern bool flag_odr;
-+
-+/// flag_vararg_requires_arguments - Do not consider functions with no arguments
-+/// to take a variable number of arguments (...).  If set then a function like
-+/// "T foo() {}" will be treated like "T foo(void) {}" and not "T foo(...) {}".
-+extern bool flag_vararg_requires_arguments;
-+
-+/// flag_force_vararg_prototypes - Force prototypes to take a variable number of
-+/// arguments (...).  This is helpful if the language front-end sometimes emits
-+/// calls where the call arguments do not match the callee function declaration.
-+extern bool flag_force_vararg_prototypes;
-+
-+/// AttributeUsedGlobals - The list of globals that are marked attribute(used).
-+extern SmallSetVector<Constant *,32> AttributeUsedGlobals;
-+
-+extern Constant* ConvertMetadataStringToGV(const char *str);
-+
-+/// AddAnnotateAttrsToGlobal - Adds decls that have a
-+/// annotate attribute to a vector to be emitted later.
-+extern void AddAnnotateAttrsToGlobal(GlobalValue *GV, tree_node *decl);
-+
-+// Mapping between GCC declarations and LLVM values.  The GCC declaration must
-+// satisfy HAS_RTL_P.
-+
-+/// DECL_LLVM - Returns the LLVM declaration of a global variable or function.
-+extern Value *make_decl_llvm(tree_node *);
-+#define DECL_LLVM(NODE) make_decl_llvm(NODE)
-+
-+/// SET_DECL_LLVM - Set the DECL_LLVM for NODE to LLVM.
-+extern Value *set_decl_llvm(tree_node *, Value *);
-+#define SET_DECL_LLVM(NODE, LLVM) set_decl_llvm(NODE, LLVM)
-+
-+/// DECL_LLVM_IF_SET - The DECL_LLVM for NODE, if it is set, or NULL, if it is
-+/// not set.
-+extern Value *get_decl_llvm(tree_node *);
-+#define DECL_LLVM_IF_SET(NODE) (HAS_RTL_P(NODE) ? get_decl_llvm(NODE) : NULL)
-+
-+/// DECL_LLVM_SET_P - Returns nonzero if the DECL_LLVM for NODE has already
-+/// been set.
-+#define DECL_LLVM_SET_P(NODE) (DECL_LLVM_IF_SET(NODE) != NULL)
-+
-+/// DEFINITION_LLVM - Ensures that the body or initial value of the given GCC
-+/// global will be output, and returns a declaration for it.
-+Value *make_definition_llvm(tree_node *decl);
-+#define DEFINITION_LLVM(NODE) make_definition_llvm(NODE)
-+
-+// Mapping between GCC declarations and non-negative integers.  The GCC
-+// declaration must not satisfy HAS_RTL_P.
-+
-+/// set_decl_index - Associate a non-negative number with the given GCC
-+/// declaration.
-+int set_decl_index(tree_node *, int);
-+
-+/// get_decl_index - Get the non-negative number associated with the given GCC
-+/// declaration.  Returns a negative value if no such association has been made.
-+int get_decl_index(tree_node *);
-+
-+void changeLLVMConstant(Constant *Old, Constant *New);
-+void register_ctor_dtor(Function *, int, bool);
-+void readLLVMTypesStringTable();
-+void writeLLVMTypesStringTable();
-+void readLLVMValues();
-+void writeLLVMValues();
-+void clearTargetBuiltinCache();
-+const char *extractRegisterName(tree_node *);
-+void handleVisibility(tree_node *decl, GlobalValue *GV);
-+Twine getLLVMAssemblerName(tree_node *);
-+
-+struct StructTypeConversionInfo;
-+
-+/// Return true if and only if field no. N from struct type T is a padding
-+/// element added to match llvm struct type size and gcc struct type size.
-+bool isPaddingElement(tree_node*, unsigned N);
-+
-+/// TypeConverter - Implement the converter from GCC types to LLVM types.
-+///
-+class TypeConverter {
-+  /// ConvertingStruct - If we are converting a RECORD or UNION to an LLVM type
-+  /// we set this flag to true.
-+  bool ConvertingStruct;
-+
-+  /// PointersToReresolve - When ConvertingStruct is true, we handling of
-+  /// POINTER_TYPE and REFERENCE_TYPE is changed to return
-+  /// opaque*'s instead of recursively calling ConvertType.  When this happens,
-+  /// we add the POINTER_TYPE to this list.
-+  ///
-+  std::vector<tree_node*> PointersToReresolve;
-+public:
-+  TypeConverter() : ConvertingStruct(false) {}
-+
-+  /// ConvertType - Returns the LLVM type to use for memory that holds a value
-+  /// of the given GCC type (GetRegType should be used for values in registers).
-+  const Type *ConvertType(tree_node *type);
-+
-+  /// GCCTypeOverlapsWithLLVMTypePadding - Return true if the specified GCC type
-+  /// has any data that overlaps with structure padding in the specified LLVM
-+  /// type.
-+  static bool GCCTypeOverlapsWithLLVMTypePadding(tree_node *t, const Type *Ty);
-+
-+
-+  /// ConvertFunctionType - Convert the specified FUNCTION_TYPE or METHOD_TYPE
-+  /// tree to an LLVM type.  This does the same thing that ConvertType does, but
-+  /// it also returns the function's LLVM calling convention and attributes.
-+  const FunctionType *ConvertFunctionType(tree_node *type,
-+                                          tree_node *decl,
-+                                          tree_node *static_chain,
-+                                          CallingConv::ID &CallingConv,
-+                                          AttrListPtr &PAL);
-+
-+  /// ConvertArgListToFnType - Given a DECL_ARGUMENTS list on an GCC tree,
-+  /// return the LLVM type corresponding to the function.  This is useful for
-+  /// turning "T foo(...)" functions into "T foo(void)" functions.
-+  const FunctionType *ConvertArgListToFnType(tree_node *type,
-+                                             tree_node *arglist,
-+                                             tree_node *static_chain,
-+                                             CallingConv::ID &CallingConv,
-+                                             AttrListPtr &PAL);
-+
-+private:
-+  const Type *ConvertRECORD(tree_node *type);
-+  bool DecodeStructFields(tree_node *Field, StructTypeConversionInfo &Info);
-+  void DecodeStructBitField(tree_node *Field, StructTypeConversionInfo &Info);
-+  void SelectUnionMember(tree_node *type, StructTypeConversionInfo &Info);
-+};
-+
-+extern TypeConverter *TheTypeConverter;
-+
-+/// ConvertType - Returns the LLVM type to use for memory that holds a value
-+/// of the given GCC type (GetRegType should be used for values in registers).
-+inline const Type *ConvertType(tree_node *type) {
-+  return TheTypeConverter->ConvertType(type);
-+}
-+
-+/// getDefaultValue - Return the default value to use for a constant or global
-+/// that has no value specified.  For example in C like languages such variables
-+/// are initialized to zero, while in Ada they hold an undefined value.
-+inline Constant *getDefaultValue(const Type *Ty) {
-+  return flag_default_initialize_globals ?
-+    Constant::getNullValue(Ty) : UndefValue::get(Ty);
-+}
-+
-+/// GetUnitType - Returns an integer one address unit wide if 'NumUnits' is 1;
-+/// otherwise returns an array of such integers with 'NumUnits' elements.  For
-+/// example, on a machine which has 16 bit bytes returns an i16 or an array of
-+/// i16.
-+extern const Type *GetUnitType(LLVMContext &C, unsigned NumUnits = 1);
-+
-+/// GetUnitPointerType - Returns an LLVM pointer type which points to memory one
-+/// address unit wide.  For example, on a machine which has 16 bit bytes returns
-+/// an i16*.
-+extern const Type *GetUnitPointerType(LLVMContext &C, unsigned AddrSpace = 0);
-+
-+/// GetFieldIndex - Return the index of the field in the given LLVM type that
-+/// corresponds to the GCC field declaration 'decl'.  This means that the LLVM
-+/// and GCC fields start in the same byte (if 'decl' is a bitfield, this means
-+/// that its first bit is within the byte the LLVM field starts at).  Returns
-+/// INT_MAX if there is no such LLVM field.
-+int GetFieldIndex(tree_node *decl, const Type *Ty);
-+
-+/// getINTEGER_CSTVal - Return the specified INTEGER_CST value as a uint64_t.
-+///
-+uint64_t getINTEGER_CSTVal(tree_node *exp);
-+
-+/// isInt64 - Return true if t is an INTEGER_CST that fits in a 64 bit integer.
-+/// If Unsigned is false, returns whether it fits in a int64_t.  If Unsigned is
-+/// true, returns whether the value is non-negative and fits in a uint64_t.
-+/// Always returns false for overflowed constants or if t is NULL.
-+bool isInt64(tree_node *t, bool Unsigned);
-+
-+/// getInt64 - Extract the value of an INTEGER_CST as a 64 bit integer.  If
-+/// Unsigned is false, the value must fit in a int64_t.  If Unsigned is true,
-+/// the value must be non-negative and fit in a uint64_t.  Must not be used on
-+/// overflowed constants.  These conditions can be checked by calling isInt64.
-+uint64_t getInt64(tree_node *t, bool Unsigned);
-+
-+/// isPassedByInvisibleReference - Return true if the specified type should be
-+/// passed by 'invisible reference'. In other words, instead of passing the
-+/// thing by value, pass the address of a temporary.
-+bool isPassedByInvisibleReference(tree_node *type);
-+
-+/// isSequentialCompatible - Return true if the specified gcc array or pointer
-+/// type and the corresponding LLVM SequentialType lay out their components
-+/// identically in memory, so doing a GEP accesses the right memory location.
-+/// We assume that objects without a known size do not.
-+extern bool isSequentialCompatible(tree_node *type);
-+
-+/// OffsetIsLLVMCompatible - Return true if the given field is offset from the
-+/// start of the record by a constant amount which is not humongously big.
-+extern bool OffsetIsLLVMCompatible(tree_node *field_decl);
-+
-+/// ArrayLengthOf - Returns the length of the given gcc array type, or ~0ULL if
-+/// the array has variable or unknown length.
-+extern uint64_t ArrayLengthOf(tree_node *type);
-+
-+/// isBitfield - Returns whether to treat the specified field as a bitfield.
-+bool isBitfield(tree_node *field_decl);
-+
-+/// getFieldOffsetInBits - Return the bit offset of a FIELD_DECL in a structure.
-+extern uint64_t getFieldOffsetInBits(tree_node *field);
-+
-+/// ValidateRegisterVariable - Check that a static "asm" variable is
-+/// well-formed.  If not, emit error messages and return true.  If so, return
-+/// false.
-+bool ValidateRegisterVariable(tree_node *decl);
-+
-+/// MemRef - This struct holds the information needed for a memory access:
-+/// a pointer to the memory, its alignment and whether the access is volatile.
-+class MemRef {
-+public:
-+  Value *Ptr;
-+  bool Volatile;
-+private:
-+  unsigned char LogAlign;
-+public:
-+  explicit MemRef() : Ptr(0), Volatile(false), LogAlign(0) {}
-+  explicit MemRef(Value *P, uint32_t A, bool V) : Ptr(P), Volatile(V) {
-+    // Forbid alignment 0 along with non-power-of-2 alignment values.
-+    assert(isPowerOf2_32(A) && "Alignment not a power of 2!");
-+    LogAlign = Log2_32(A);
-+  }
-+
-+  uint32_t getAlignment() const {
-+    return 1U << LogAlign;
-+  }
-+
-+  void setAlignment(uint32_t A) {
-+    LogAlign = Log2_32(A);
-+  }
-+};
-+
-+/// LValue - This struct represents an lvalue in the program.  In particular,
-+/// the Ptr member indicates the memory that the lvalue lives in.  Alignment
-+/// is the alignment of the memory (in bytes).If this is a bitfield reference,
-+/// BitStart indicates the first bit in the memory that is part of the field
-+/// and BitSize indicates the extent.
-+///
-+/// "LValue" is intended to be a light-weight object passed around by-value.
-+class LValue : public MemRef {
-+public:
-+  unsigned char BitStart;
-+  unsigned char BitSize;
-+public:
-+  explicit LValue() : BitStart(255), BitSize(255) {}
-+  explicit LValue(MemRef &M) : MemRef(M), BitStart(255), BitSize(255) {}
-+  LValue(Value *P, uint32_t A, bool V = false) :
-+      MemRef(P, A, V), BitStart(255), BitSize(255) {}
-+  LValue(Value *P, uint32_t A, unsigned BSt, unsigned BSi, bool V = false) :
-+      MemRef(P, A, V), BitStart(BSt), BitSize(BSi) {
-+    assert(BitStart == BSt && BitSize == BSi &&
-+           "Bit values larger than 256?");
-+  }
-+
-+  bool isBitfield() const { return BitStart != 255; }
-+};
-+
-+/// PhiRecord - This struct holds the LLVM PHI node associated with a GCC phi.
-+struct PhiRecord {
-+  gimple_statement_d *gcc_phi;
-+  PHINode *PHI;
-+};
-+
-+/// TreeToLLVM - An instance of this class is created and used to convert the
-+/// body of each function to LLVM.
-+///
-+class TreeToLLVM {
-+  // State that is initialized when the function starts.
-+  const DataLayout &TD;
-+  tree_node *FnDecl;
-+  Function *Fn;
-+  BasicBlock *ReturnBB;
-+  unsigned ReturnOffset;
-+
-+  // State that changes as the function is emitted.
-+
-+  /// Builder - Instruction creator, the location to insert into is always the
-+  /// same as &Fn->back().
-+  LLVMBuilder Builder;
-+
-+  // AllocaInsertionPoint - Place to insert alloca instructions.  Lazily created
-+  // and managed by CreateTemporary.
-+  Instruction *AllocaInsertionPoint;
-+
-+  // SSAInsertionPoint - Place to insert reads corresponding to SSA default
-+  // definitions.
-+  Instruction *SSAInsertionPoint;
-+
-+  /// BasicBlocks - Map from GCC to LLVM basic blocks.
-+  DenseMap<basic_block_def *, BasicBlock*> BasicBlocks;
-+
-+  /// LocalDecls - Map from local declarations to their associated LLVM values.
-+  DenseMap<tree_node *, AssertingVH<Value> > LocalDecls;
-+
-+  /// PendingPhis - Phi nodes which have not yet been populated with operands.
-+  SmallVector<PhiRecord, 16> PendingPhis;
-+
-+  // SSANames - Map from GCC ssa names to the defining LLVM value.
-+  DenseMap<tree_node *, TrackingVH<Value> > SSANames;
-+
-+public:
-+
-+  //===---------------------- Local Declarations --------------------------===//
-+
-+  /// DECL_LOCAL - Like DECL_LLVM, returns the LLVM declaration of a variable or
-+  /// function.  However DECL_LOCAL can be used with declarations local to the
-+  /// current function as well as with global declarations.
-+  Value *make_decl_local(tree_node *);
-+  #define DECL_LOCAL(NODE) make_decl_local(NODE)
-+
-+  /// DEFINITION_LOCAL - Like DEFINITION_LLVM, ensures that the initial value or
-+  /// body of a variable or function will be output.  However DEFINITION_LOCAL
-+  /// can be used with declarations local to the current function as well as
-+  /// with global declarations.
-+  Value *make_definition_local(tree_node *);
-+  #define DEFINITION_LOCAL(NODE) make_definition_local(NODE)
-+
-+  /// SET_DECL_LOCAL - Set the DECL_LOCAL for NODE to LLVM.
-+  Value *set_decl_local(tree_node *, Value *);
-+  #define SET_DECL_LOCAL(NODE, LLVM) set_decl_local(NODE, LLVM)
-+
-+  /// DECL_LOCAL_IF_SET - The DECL_LOCAL for NODE, if it is set, or NULL, if it
-+  /// is not set.
-+  Value *get_decl_local(tree_node *);
-+  #define DECL_LOCAL_IF_SET(NODE) (HAS_RTL_P(NODE) ? get_decl_local(NODE) : NULL)
-+
-+  /// DECL_LOCAL_SET_P - Returns nonzero if the DECL_LOCAL for NODE has already
-+  /// been set.
-+  #define DECL_LOCAL_SET_P(NODE) (DECL_LOCAL_IF_SET(NODE) != NULL)
-+
-+
-+private:
-+
-+  //===---------------------- Exception Handling --------------------------===//
-+
-+  /// NormalInvokes - Mapping from landing pad number to the set of invoke
-+  /// instructions that unwind to that landing pad.
-+  SmallVector<SmallVector<InvokeInst *, 8>, 16> NormalInvokes;
-+
-+  /// ExceptionPtrs - Mapping from EH region index to the local holding the
-+  /// exception pointer for that region.
-+  SmallVector<AllocaInst *, 16> ExceptionPtrs;
-+
-+  /// ExceptionFilters - Mapping from EH region index to the local holding the
-+  /// filter value for that region.
-+  SmallVector<AllocaInst *, 16> ExceptionFilters;
-+
-+  /// FailureBlocks - Mapping from the index of a must-not-throw EH region to
-+  /// the block containing the failure code for the region (the code that is
-+  /// run if an exception is thrown in this region).
-+  SmallVector<BasicBlock *, 16> FailureBlocks;
-+
-+  /// RewindBB - Block containing code that continues unwinding an exception.
-+  BasicBlock *RewindBB;
-+
-+  /// RewindTmp - Local holding the exception to continue unwinding.
-+  AllocaInst *RewindTmp;
-+
-+public:
-+  TreeToLLVM(tree_node *fndecl);
-+  ~TreeToLLVM();
-+
-+  /// getFUNCTION_DECL - Return the FUNCTION_DECL node for the current function
-+  /// being compiled.
-+  tree_node *getFUNCTION_DECL() const { return FnDecl; }
-+
-+  /// EmitFunction - Convert 'fndecl' to LLVM code.
-+  Function *EmitFunction();
-+
-+  /// EmitBasicBlock - Convert the given basic block.
-+  void EmitBasicBlock(basic_block_def *bb);
-+
-+  /// EmitLV - Convert the specified l-value tree node to LLVM code, returning
-+  /// the address of the result.
-+  LValue EmitLV(tree_node *exp);
-+
-+  void TODO(tree_node *exp = 0);
-+
-+  /// CastToAnyType - Cast the specified value to the specified type regardless
-+  /// of the types involved. This is an inferred cast.
-+  Value *CastToAnyType (Value *V, bool VSigned, const Type *Ty, bool TySigned);
-+
-+  /// CastToUIntType - Cast the specified value to the specified type assuming
-+  /// that V's type and Ty are integral types. This arbitrates between BitCast,
-+  /// Trunc and ZExt.
-+  Value *CastToUIntType(Value *V, const Type *Ty);
-+
-+  /// CastToSIntType - Cast the specified value to the specified type assuming
-+  /// that V's type and Ty are integral types. This arbitrates between BitCast,
-+  /// Trunc and SExt.
-+  Value *CastToSIntType(Value *V, const Type *Ty);
-+
-+  /// CastToFPType - Cast the specified value to the specified type assuming
-+  /// that V's type and Ty are floating point types. This arbitrates between
-+  /// BitCast, FPTrunc and FPExt.
-+  Value *CastToFPType(Value *V, const Type *Ty);
-+
-+  /// CreateAnyAdd - Add two LLVM scalar values with the given GCC type.  Does
-+  /// not support complex numbers.  The type is used to set overflow flags.
-+  Value *CreateAnyAdd(Value *LHS, Value *RHS, tree_node *type);
-+
-+  /// CreateAnyMul - Multiply two LLVM scalar values with the given GCC type.
-+  /// Does not support complex numbers.  The type is used to set overflow flags.
-+  Value *CreateAnyMul(Value *LHS, Value *RHS, tree_node *type);
-+
-+  /// CreateAnyNeg - Negate an LLVM scalar value with the given GCC type.  Does
-+  /// not support complex numbers.  The type is used to set overflow flags.
-+  Value *CreateAnyNeg(Value *V, tree_node *type);
-+
-+  /// CreateAnySub - Subtract two LLVM scalar values with the given GCC type.
-+  /// Does not support complex numbers.
-+  Value *CreateAnySub(Value *LHS, Value *RHS, tree_node *type);
-+
-+  /// CreateTemporary - Create a new alloca instruction of the specified type,
-+  /// inserting it into the entry block and returning it.  The resulting
-+  /// instruction's type is a pointer to the specified type.
-+  AllocaInst *CreateTemporary(const Type *Ty, unsigned align=0);
-+
-+  /// CreateTempLoc - Like CreateTemporary, but returns a MemRef.
-+  MemRef CreateTempLoc(const Type *Ty);
-+
-+  /// EmitAggregateCopy - Copy the elements from SrcLoc to DestLoc, using the
-+  /// GCC type specified by GCCType to know which elements to copy.
-+  void EmitAggregateCopy(MemRef DestLoc, MemRef SrcLoc, tree_node *GCCType);
-+
-+  /// EmitAggregate - Store the specified tree node into the location given by
-+  /// DestLoc.
-+  void EmitAggregate(tree_node *exp, const MemRef &DestLoc);
-+
-+private: // Helper functions.
-+
-+  /// StartFunctionBody - Start the emission of 'fndecl', outputing all
-+  /// declarations for parameters and setting things up.
-+  void StartFunctionBody();
-+
-+  /// FinishFunctionBody - Once the body of the function has been emitted, this
-+  /// cleans up and returns the result function.
-+  Function *FinishFunctionBody();
-+
-+  /// PopulatePhiNodes - Populate generated phi nodes with their operands.
-+  void PopulatePhiNodes();
-+
-+  /// getBasicBlock - Find or create the LLVM basic block corresponding to BB.
-+  BasicBlock *getBasicBlock(basic_block_def *bb);
-+
-+  /// getLabelDeclBlock - Lazily get and create a basic block for the specified
-+  /// label.
-+  BasicBlock *getLabelDeclBlock(tree_node *LabelDecl);
-+
-+  /// DefineSSAName - Use the given value as the definition of the given SSA
-+  /// name.  Returns the provided value as a convenience.
-+  Value *DefineSSAName(tree_node *reg, Value *Val);
-+
-+  /// BeginBlock - Add the specified basic block to the end of the function.  If
-+  /// the previous block falls through into it, add an explicit branch.
-+  void BeginBlock(BasicBlock *BB);
-+
-+  /// EmitAggregateZero - Zero the elements of DestLoc.
-+  void EmitAggregateZero(MemRef DestLoc, tree_node *GCCType);
-+
-+  /// EmitMemCpy/EmitMemMove/EmitMemSet - Emit an llvm.memcpy/llvm.memmove or
-+  /// llvm.memset call with the specified operands.  Returns DestPtr bitcast
-+  /// to i8*.
-+  Value *EmitMemCpy(Value *DestPtr, Value *SrcPtr, Value *Size, unsigned Align);
-+  Value *EmitMemMove(Value *DestPtr, Value *SrcPtr, Value *Size, unsigned Align);
-+  Value *EmitMemSet(Value *DestPtr, Value *SrcVal, Value *Size, unsigned Align);
-+
-+  /// EmitLandingPads - Emit EH landing pads.
-+  void EmitLandingPads();
-+
-+  /// EmitFailureBlocks - Emit the blocks containing failure code executed when
-+  /// an exception is thrown in a must-not-throw region.
-+  void EmitFailureBlocks();
-+
-+  /// EmitRewindBlock - Emit the block containing code to continue unwinding an
-+  /// exception.
-+  void EmitRewindBlock();
-+
-+  /// EmitDebugInfo - Return true if debug info is to be emitted for current
-+  /// function.
-+  bool EmitDebugInfo();
-+
-+private: // Helpers for exception handling.
-+
-+  /// getLandingPad - Return the landing pad for the given exception handling
-+  /// region, creating it if necessary.
-+  BasicBlock *getLandingPad(unsigned RegionNo);
-+
-+  /// getExceptionPtr - Return the local holding the exception pointer for the
-+  /// given exception handling region, creating it if necessary.
-+  AllocaInst *getExceptionPtr(unsigned RegionNo);
-+
-+  /// getExceptionFilter - Return the local holding the filter value for the
-+  /// given exception handling region, creating it if necessary.
-+  AllocaInst *getExceptionFilter(unsigned RegionNo);
-+
-+  /// getFailureBlock - Return the basic block containing the failure code for
-+  /// the given exception handling region, creating it if necessary.
-+  BasicBlock *getFailureBlock(unsigned RegionNo);
-+
-+private:
-+  void EmitAutomaticVariableDecl(tree_node *decl);
-+
-+  /// EmitAnnotateIntrinsic - Emits call to annotate attr intrinsic
-+  void EmitAnnotateIntrinsic(Value *V, tree_node *decl);
-+
-+  /// EmitTypeGcroot - Emits call to make type a gcroot
-+  void EmitTypeGcroot(Value *V);
-+
-+private:
-+
-+  //===------------------ Render* - Convert GIMPLE to LLVM ----------------===//
-+
-+  void RenderGIMPLE_ASM(gimple_statement_d *stmt);
-+  void RenderGIMPLE_ASSIGN(gimple_statement_d *stmt);
-+  void RenderGIMPLE_CALL(gimple_statement_d *stmt);
-+  void RenderGIMPLE_COND(gimple_statement_d *stmt);
-+  void RenderGIMPLE_EH_DISPATCH(gimple_statement_d *stmt);
-+  void RenderGIMPLE_GOTO(gimple_statement_d *stmt);
-+  void RenderGIMPLE_RESX(gimple_statement_d *stmt);
-+  void RenderGIMPLE_RETURN(gimple_statement_d *stmt);
-+  void RenderGIMPLE_SWITCH(gimple_statement_d *stmt);
-+
-+  // Render helpers.
-+
-+  /// EmitAssignRHS - Convert the RHS of a scalar GIMPLE_ASSIGN to LLVM.
-+  Value *EmitAssignRHS(gimple_statement_d *stmt);
-+
-+  /// EmitAssignSingleRHS - Helper for EmitAssignRHS.  Handles those RHS that
-+  /// are not register expressions.
-+  Value *EmitAssignSingleRHS(tree_node *rhs);
-+
-+  /// OutputCallRHS - Convert the RHS of a GIMPLE_CALL.
-+  Value *OutputCallRHS(gimple_statement_d *stmt, const MemRef *DestLoc);
-+
-+  /// WriteScalarToLHS - Store RHS, a non-aggregate value, into the given LHS.
-+  void WriteScalarToLHS(tree_node *lhs, Value *Scalar);
-+
-+private:
-+
-+  //===---------- EmitReg* - Convert register expression to LLVM ----------===//
-+
-+  /// GetRegType - Returns the LLVM type to use for registers that hold a value
-+  /// of the scalar GCC type 'type'.  All of the EmitReg* routines use this to
-+  /// determine the LLVM type to return.
-+  const Type *GetRegType(tree_node *type);
-+
-+  /// UselesslyTypeConvert - The useless_type_conversion_p predicate implicitly
-+  /// defines the GCC middle-end type system.  For scalar GCC types inner_type
-+  /// and outer_type, if 'useless_type_conversion_p(outer_type, inner_type)' is
-+  /// true then the corresponding LLVM inner and outer types (see GetRegType)
-+  /// are equal except possibly if they are both pointer types (casts to 'void*'
-+  /// are considered useless for example) or types derived from pointer types
-+  /// (vector types with pointer element type are the only possibility here).
-+  /// This method converts LLVM values of the inner type to the outer type.
-+  Value *UselesslyTypeConvert(Value *V, const Type *Ty) {
-+    return Builder.CreateBitCast(V, Ty);
-+  }
-+
-+  /// EmitRegister - Convert the specified gimple register or local constant of
-+  /// register type to an LLVM value.  Only creates code in the entry block.
-+  Value *EmitRegister(tree_node *reg);
-+
-+  /// EmitReg_SSA_NAME - Return the defining value of the given SSA_NAME.
-+  /// Only creates code in the entry block.
-+  Value *EmitReg_SSA_NAME(tree_node *reg);
-+
-+  // Unary expressions.
-+  Value *EmitReg_ABS_EXPR(tree_node *op);
-+  Value *EmitReg_BIT_NOT_EXPR(tree_node *op);
-+  Value *EmitReg_CONJ_EXPR(tree_node *op);
-+  Value *EmitReg_CONVERT_EXPR(tree_node *type, tree_node *op);
-+  Value *EmitReg_NEGATE_EXPR(tree_node *op);
-+  Value *EmitReg_PAREN_EXPR(tree_node *exp);
-+  Value *EmitReg_TRUTH_NOT_EXPR(tree_node *type, tree_node *op);
-+
-+  // Comparisons.
-+
-+  /// EmitCompare - Compare LHS with RHS using the appropriate comparison code.
-+  /// The result is an i1 boolean.
-+  Value *EmitCompare(tree_node *lhs, tree_node *rhs, unsigned code);
-+
-+  // Binary expressions.
-+  Value *EmitReg_MinMaxExpr(tree_node *type, tree_node *op0, tree_node *op1,
-+                            unsigned UIPred, unsigned SIPred, unsigned Opc,
-+                            bool isMax);
-+  Value *EmitReg_RotateOp(tree_node *type, tree_node *op0, tree_node *op1,
-+                          unsigned Opc1, unsigned Opc2);
-+  Value *EmitReg_ShiftOp(tree_node *op0, tree_node *op1, unsigned Opc);
-+  Value *EmitReg_TruthOp(tree_node *type, tree_node *op0, tree_node *op1,
-+                         unsigned Opc);
-+  Value *EmitReg_BIT_AND_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_BIT_IOR_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_BIT_XOR_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_CEIL_DIV_EXPR(tree_node *type, tree_node *op0, tree_node *op1);
-+  Value *EmitReg_COMPLEX_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_FLOOR_DIV_EXPR(tree_node *type, tree_node *op0,
-+                                tree_node *op1);
-+  Value *EmitReg_FLOOR_MOD_EXPR(tree_node *type, tree_node *op0,
-+                                tree_node *op1);
-+  Value *EmitReg_MINUS_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_MULT_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_PLUS_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_POINTER_PLUS_EXPR(tree_node *type, tree_node *op0,
-+                                   tree_node *op1);
-+  Value *EmitReg_RDIV_EXPR(tree_node *op0, tree_node *op1);
-+  Value *EmitReg_ROUND_DIV_EXPR(tree_node *type, tree_node *op0,
-+                                tree_node *op1);
-+  Value *EmitReg_TRUNC_DIV_EXPR(tree_node *op0, tree_node *op1, bool isExact);
-+  Value *EmitReg_TRUNC_MOD_EXPR(tree_node *op0, tree_node *op1);
-+
-+  Value *EmitLoadOfLValue(tree_node *exp);
-+  Value *EmitOBJ_TYPE_REF(tree_node *exp);
-+  Value *EmitADDR_EXPR(tree_node *exp);
-+  Value *EmitCallOf(Value *Callee, gimple_statement_d *stmt,
-+                    const MemRef *DestLoc, const AttrListPtr &PAL);
-+  CallInst *EmitSimpleCall(StringRef CalleeName, tree_node *ret_type,
-+                           /* arguments */ ...) END_WITH_NULL;
-+  Value *EmitFieldAnnotation(Value *FieldPtr, tree_node *FieldDecl);
-+
-+  // Inline Assembly and Register Variables.
-+  Value *EmitReadOfRegisterVariable(tree_node *vardecl);
-+  void EmitModifyOfRegisterVariable(tree_node *vardecl, Value *RHS);
-+
-+  // Helpers for Builtin Function Expansion.
-+  void EmitMemoryBarrier(bool ll, bool ls, bool sl, bool ss, bool device);
-+  Value *BuildVector(const std::vector<Value*> &Elts);
-+  Value *BuildVector(Value *Elt, ...);
-+  Value *BuildVectorShuffle(Value *InVec1, Value *InVec2, ...);
-+  Value *BuildBinaryAtomicBuiltin(gimple_statement_d *stmt, Intrinsic::ID id);
-+  Value *BuildCmpAndSwapAtomicBuiltin(gimple_statement_d *stmt, tree_node *type,
-+                                      bool isBool);
-+
-+  // Builtin Function Expansion.
-+  bool EmitBuiltinCall(gimple_statement_d *stmt, tree_node *fndecl,
-+                       const MemRef *DestLoc, Value *&Result);
-+  bool EmitFrontendExpandedBuiltinCall(gimple_statement_d *stmt,
-+                                       tree_node *fndecl, const MemRef *DestLoc,
-+                                       Value *&Result);
-+  bool EmitBuiltinUnaryOp(Value *InVal, Value *&Result, Intrinsic::ID Id);
-+  Value *EmitBuiltinSQRT(gimple_statement_d *stmt);
-+  Value *EmitBuiltinPOWI(gimple_statement_d *stmt);
-+  Value *EmitBuiltinPOW(gimple_statement_d *stmt);
-+  Value *EmitBuiltinLCEIL(gimple_statement_d *stmt);
-+  Value *EmitBuiltinLFLOOR(gimple_statement_d *stmt);
-+
-+  bool EmitBuiltinConstantP(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinAlloca(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinExpect(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinExtendPointer(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinVAStart(gimple_statement_d *stmt);
-+  bool EmitBuiltinVAEnd(gimple_statement_d *stmt);
-+  bool EmitBuiltinVACopy(gimple_statement_d *stmt);
-+  bool EmitBuiltinMemCopy(gimple_statement_d *stmt, Value *&Result,
-+                          bool isMemMove, bool SizeCheck);
-+  bool EmitBuiltinMemSet(gimple_statement_d *stmt, Value *&Result,
-+                         bool SizeCheck);
-+  bool EmitBuiltinBZero(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinPrefetch(gimple_statement_d *stmt);
-+  bool EmitBuiltinReturnAddr(gimple_statement_d *stmt, Value *&Result,
-+                             bool isFrame);
-+  bool EmitBuiltinExtractReturnAddr(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinFrobReturnAddr(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinStackSave(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinStackRestore(gimple_statement_d *stmt);
-+  bool EmitBuiltinEHPointer(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinDwarfCFA(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinDwarfSPColumn(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinEHReturnDataRegno(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinEHReturn(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinInitDwarfRegSizes(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinUnwindInit(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinAdjustTrampoline(gimple_statement_d *stmt, Value *&Result);
-+  bool EmitBuiltinInitTrampoline(gimple_statement_d *stmt, Value *&Result);
-+
-+  // Complex Math Expressions.
-+  Value *CreateComplex(Value *Real, Value *Imag, tree_node *elt_type);
-+  void SplitComplex(Value *Complex, Value *&Real, Value *&Imag,
-+                    tree_node *elt_type);
-+
-+  // L-Value Expressions.
-+  LValue EmitLV_ARRAY_REF(tree_node *exp);
-+  LValue EmitLV_BIT_FIELD_REF(tree_node *exp);
-+  LValue EmitLV_COMPONENT_REF(tree_node *exp);
-+  LValue EmitLV_DECL(tree_node *exp);
-+  LValue EmitLV_INDIRECT_REF(tree_node *exp);
-+  LValue EmitLV_VIEW_CONVERT_EXPR(tree_node *exp);
-+  LValue EmitLV_WITH_SIZE_EXPR(tree_node *exp);
-+  LValue EmitLV_XXXXPART_EXPR(tree_node *exp, unsigned Idx);
-+  LValue EmitLV_SSA_NAME(tree_node *exp);
-+  LValue EmitLV_TARGET_MEM_REF(tree_node *exp);
-+
-+  // Constant Expressions.
-+  Value *EmitINTEGER_CST(tree_node *exp);
-+  Value *EmitREAL_CST(tree_node *exp);
-+  Value *EmitCONSTRUCTOR(tree_node *exp, const MemRef *DestLoc);
-+
-+
-+  // Emit helpers.
-+
-+  /// EmitMinInvariant - The given value is constant in this function.  Return
-+  /// the corresponding LLVM value. Only creates code in the entry block.
-+  Value *EmitMinInvariant(tree_node *reg);
-+
-+  /// EmitInvariantAddress - The given address is constant in this function.
-+  /// Return the corresponding LLVM value. Only creates code in the entry block.
-+  Value *EmitInvariantAddress(tree_node *addr);
-+
-+  /// EmitRegisterConstant - Convert the given global constant of register type
-+  /// to an LLVM constant.  Creates no code, only constants.
-+  Constant *EmitRegisterConstant(tree_node *reg);
-+
-+  /// EmitComplexRegisterConstant - Turn the given COMPLEX_CST into an LLVM
-+  /// constant of the corresponding register type.
-+  Constant *EmitComplexRegisterConstant(tree_node *reg);
-+
-+  /// EmitIntegerRegisterConstant - Turn the given INTEGER_CST into an LLVM
-+  /// constant of the corresponding register type.
-+  Constant *EmitIntegerRegisterConstant(tree_node *reg);
-+
-+  /// EmitRealRegisterConstant - Turn the given REAL_CST into an LLVM constant
-+  /// of the corresponding register type.
-+  Constant *EmitRealRegisterConstant(tree_node *reg);
-+
-+  /// EmitConstantVectorConstructor - Turn the given constant CONSTRUCTOR into
-+  /// an LLVM constant of the corresponding vector register type.
-+  Constant *EmitConstantVectorConstructor(tree_node *reg);
-+
-+  /// EmitVectorRegisterConstant - Turn the given VECTOR_CST into an LLVM
-+  /// constant of the corresponding register type.
-+  Constant *EmitVectorRegisterConstant(tree_node *reg);
-+
-+  /// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
-+  /// to in-register type (that given by GetRegType).  TODO: Eliminate these
-+  /// methods: "memory" values should never be held in registers.  Currently
-+  /// this is mainly used for marshalling function parameters and return values,
-+  /// but that should be completely independent of the reg vs mem value logic.
-+  Value *Mem2Reg(Value *V, tree_node *type, LLVMBuilder &Builder);
-+  Constant *Mem2Reg(Constant *C, tree_node *type, TargetFolder &Folder);
-+
-+  /// Reg2Mem - Convert a value of in-register type (that given by GetRegType)
-+  /// to in-memory type (that given by ConvertType).  TODO: Eliminate this
-+  /// method: "memory" values should never be held in registers.  Currently
-+  /// this is mainly used for marshalling function parameters and return values,
-+  /// but that should be completely independent of the reg vs mem value logic.
-+  Value *Reg2Mem(Value *V, tree_node *type, LLVMBuilder &Builder);
-+
-+  /// EmitMemory - Convert the specified gimple register or local constant of
-+  /// register type to an LLVM value with in-memory type (given by ConvertType).
-+  /// TODO: Eliminate this method, see Mem2Reg and Reg2Mem above.
-+  Value *EmitMemory(tree_node *reg);
-+
-+  /// LoadRegisterFromMemory - Loads a value of the given scalar GCC type from
-+  /// the memory location pointed to by Loc.  Takes care of adjusting for any
-+  /// differences between in-memory and in-register types (the returned value
-+  /// is of in-register type, as returned by GetRegType).
-+  Value *LoadRegisterFromMemory(MemRef Loc, tree_node *type,
-+                                LLVMBuilder &Builder);
-+
-+  /// StoreRegisterToMemory - Stores the given value to the memory pointed to by
-+  /// Loc.  Takes care of adjusting for any differences between the value's type
-+  /// (which is the in-register type given by GetRegType) and the in-memory type.
-+  void StoreRegisterToMemory(Value *V, MemRef Loc, tree_node *type,
-+                             LLVMBuilder &Builder);
-+
-+private:
-+  // Optional target defined builtin intrinsic expanding function.
-+  bool TargetIntrinsicLower(gimple_statement_d *stmt,
-+                            tree_node *fndecl,
-+                            const MemRef *DestLoc,
-+                            Value *&Result,
-+                            const Type *ResultType,
-+                            std::vector<Value*> &Ops);
-+
-+public:
-+  // Helper for taking the address of a label.
-+  Constant *AddressOfLABEL_DECL(tree_node *exp);
-+};
-+
-+#endif /* DRAGONEGG_INTERNALS_H */
-diff -r -u -N dragonegg-2.9-old/include/dragonegg/Trees.h dragonegg-2.9-new/include/dragonegg/Trees.h
---- dragonegg-2.9-old/include/dragonegg/Trees.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/include/dragonegg/Trees.h	2011-04-09 00:38:06.630097839 +0200
-@@ -0,0 +1,44 @@
-+//=---- Trees.h - Utility functions for working with GCC trees ----*- C++ -*-=//
-+//
-+// Copyright (C) 2010, 2011  Duncan Sands.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares utility functions for working with GCC trees.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_TREES_H
-+#define DRAGONEGG_TREES_H
-+
-+// System headers
-+#include <string>
-+
-+union tree_node;
-+
-+/// getDescriptiveName - Return a helpful name for the given tree, or an empty
-+/// string if no sensible name was found.  These names are used to make the IR
-+/// more readable, and have no official status.
-+std::string getDescriptiveName(union tree_node *t);
-+
-+/// hasNUW - Return whether overflowing unsigned operations on this type result
-+/// in undefined behaviour.
-+bool hasNUW(tree_node *type);
-+
-+/// hasNSW - Return whether overflowing signed operations on this type result
-+/// in undefined behaviour.
-+bool hasNSW(tree_node *type);
-+
-+#endif /* DRAGONEGG_TREES_H */
-diff -r -u -N dragonegg-2.9-old/Internals.h dragonegg-2.9-new/Internals.h
---- dragonegg-2.9-old/Internals.h	2011-03-29 08:26:30.000000000 +0200
-+++ dragonegg-2.9-new/Internals.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,866 +0,0 @@
--//=---- Internals.h - Interface between the backend components ----*- C++ -*-=//
--//
--// Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011  Chris Lattner,
--// Duncan Sands et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares the internal interfaces shared among the dragonegg files.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_INTERNALS_H
--#define DRAGONEGG_INTERNALS_H
--
--// LLVM headers
--#include "llvm/Intrinsics.h"
--#include "llvm/ADT/DenseMap.h"
--#include "llvm/ADT/SetVector.h"
--#include "llvm/Support/IRBuilder.h"
--#include "llvm/Support/TargetFolder.h"
--
--struct basic_block_def;
--union gimple_statement_d;
--union tree_node;
--
--namespace llvm {
--  class Module;
--  class GlobalVariable;
--  class Function;
--  class GlobalValue;
--  class BasicBlock;
--  class Instruction;
--  class AllocaInst;
--  class BranchInst;
--  class Value;
--  class Constant;
--  class ConstantInt;
--  class Type;
--  class FunctionType;
--  class TargetMachine;
--  class DataLayout;
--  class DebugInfo;
--  template<typename> class AssertingVH;
--  template<typename> class TrackingVH;
--}
--using namespace llvm;
--
--typedef IRBuilder<true, TargetFolder> LLVMBuilder;
--
--// Global state.
--
--/// TheModule - This is the current global module that we are compiling into.
--///
--extern llvm::Module *TheModule;
--
--/// TheDebugInfo - This object is responsible for gather all debug information.
--/// If it's value is NULL then no debug information should be gathered.
--extern llvm::DebugInfo *TheDebugInfo;
--
--/// TheTarget - The current target being compiled for.
--///
--extern llvm::TargetMachine *TheTarget;
--
--/// TheFolder - The constant folder to use.
--extern TargetFolder *TheFolder;
--
--/// getDataLayout - Return the current DataLayout object from TheTarget.
--const DataLayout &getDataLayout();
--
--/// flag_default_initialize_globals - Whether global variables with no explicit
--/// initial value should be zero initialized.
--extern bool flag_default_initialize_globals;
--
--/// flag_odr - Whether the language being compiled obeys the One Definition Rule
--/// (i.e. if the same function is defined in multiple compilation units, all the
--/// definitions are equivalent).
--extern bool flag_odr;
--
--/// flag_vararg_requires_arguments - Do not consider functions with no arguments
--/// to take a variable number of arguments (...).  If set then a function like
--/// "T foo() {}" will be treated like "T foo(void) {}" and not "T foo(...) {}".
--extern bool flag_vararg_requires_arguments;
--
--/// flag_force_vararg_prototypes - Force prototypes to take a variable number of
--/// arguments (...).  This is helpful if the language front-end sometimes emits
--/// calls where the call arguments do not match the callee function declaration.
--extern bool flag_force_vararg_prototypes;
--
--/// AttributeUsedGlobals - The list of globals that are marked attribute(used).
--extern SmallSetVector<Constant *,32> AttributeUsedGlobals;
--
--extern Constant* ConvertMetadataStringToGV(const char *str);
--
--/// AddAnnotateAttrsToGlobal - Adds decls that have a
--/// annotate attribute to a vector to be emitted later.
--extern void AddAnnotateAttrsToGlobal(GlobalValue *GV, tree_node *decl);
--
--// Mapping between GCC declarations and LLVM values.  The GCC declaration must
--// satisfy HAS_RTL_P.
--
--/// DECL_LLVM - Returns the LLVM declaration of a global variable or function.
--extern Value *make_decl_llvm(tree_node *);
--#define DECL_LLVM(NODE) make_decl_llvm(NODE)
--
--/// SET_DECL_LLVM - Set the DECL_LLVM for NODE to LLVM.
--extern Value *set_decl_llvm(tree_node *, Value *);
--#define SET_DECL_LLVM(NODE, LLVM) set_decl_llvm(NODE, LLVM)
--
--/// DECL_LLVM_IF_SET - The DECL_LLVM for NODE, if it is set, or NULL, if it is
--/// not set.
--extern Value *get_decl_llvm(tree_node *);
--#define DECL_LLVM_IF_SET(NODE) (HAS_RTL_P(NODE) ? get_decl_llvm(NODE) : NULL)
--
--/// DECL_LLVM_SET_P - Returns nonzero if the DECL_LLVM for NODE has already
--/// been set.
--#define DECL_LLVM_SET_P(NODE) (DECL_LLVM_IF_SET(NODE) != NULL)
--
--/// DEFINITION_LLVM - Ensures that the body or initial value of the given GCC
--/// global will be output, and returns a declaration for it.
--Value *make_definition_llvm(tree_node *decl);
--#define DEFINITION_LLVM(NODE) make_definition_llvm(NODE)
--
--// Mapping between GCC declarations and non-negative integers.  The GCC
--// declaration must not satisfy HAS_RTL_P.
--
--/// set_decl_index - Associate a non-negative number with the given GCC
--/// declaration.
--int set_decl_index(tree_node *, int);
--
--/// get_decl_index - Get the non-negative number associated with the given GCC
--/// declaration.  Returns a negative value if no such association has been made.
--int get_decl_index(tree_node *);
--
--void changeLLVMConstant(Constant *Old, Constant *New);
--void register_ctor_dtor(Function *, int, bool);
--void readLLVMTypesStringTable();
--void writeLLVMTypesStringTable();
--void readLLVMValues();
--void writeLLVMValues();
--void clearTargetBuiltinCache();
--const char *extractRegisterName(tree_node *);
--void handleVisibility(tree_node *decl, GlobalValue *GV);
--Twine getLLVMAssemblerName(tree_node *);
--
--struct StructTypeConversionInfo;
--
--/// Return true if and only if field no. N from struct type T is a padding
--/// element added to match llvm struct type size and gcc struct type size.
--bool isPaddingElement(tree_node*, unsigned N);
--
--/// TypeConverter - Implement the converter from GCC types to LLVM types.
--///
--class TypeConverter {
--  /// ConvertingStruct - If we are converting a RECORD or UNION to an LLVM type
--  /// we set this flag to true.
--  bool ConvertingStruct;
--
--  /// PointersToReresolve - When ConvertingStruct is true, we handling of
--  /// POINTER_TYPE and REFERENCE_TYPE is changed to return
--  /// opaque*'s instead of recursively calling ConvertType.  When this happens,
--  /// we add the POINTER_TYPE to this list.
--  ///
--  std::vector<tree_node*> PointersToReresolve;
--public:
--  TypeConverter() : ConvertingStruct(false) {}
--
--  /// ConvertType - Returns the LLVM type to use for memory that holds a value
--  /// of the given GCC type (GetRegType should be used for values in registers).
--  const Type *ConvertType(tree_node *type);
--
--  /// GCCTypeOverlapsWithLLVMTypePadding - Return true if the specified GCC type
--  /// has any data that overlaps with structure padding in the specified LLVM
--  /// type.
--  static bool GCCTypeOverlapsWithLLVMTypePadding(tree_node *t, const Type *Ty);
--
--
--  /// ConvertFunctionType - Convert the specified FUNCTION_TYPE or METHOD_TYPE
--  /// tree to an LLVM type.  This does the same thing that ConvertType does, but
--  /// it also returns the function's LLVM calling convention and attributes.
--  const FunctionType *ConvertFunctionType(tree_node *type,
--                                          tree_node *decl,
--                                          tree_node *static_chain,
--                                          CallingConv::ID &CallingConv,
--                                          AttrListPtr &PAL);
--
--  /// ConvertArgListToFnType - Given a DECL_ARGUMENTS list on an GCC tree,
--  /// return the LLVM type corresponding to the function.  This is useful for
--  /// turning "T foo(...)" functions into "T foo(void)" functions.
--  const FunctionType *ConvertArgListToFnType(tree_node *type,
--                                             tree_node *arglist,
--                                             tree_node *static_chain,
--                                             CallingConv::ID &CallingConv,
--                                             AttrListPtr &PAL);
--
--private:
--  const Type *ConvertRECORD(tree_node *type);
--  bool DecodeStructFields(tree_node *Field, StructTypeConversionInfo &Info);
--  void DecodeStructBitField(tree_node *Field, StructTypeConversionInfo &Info);
--  void SelectUnionMember(tree_node *type, StructTypeConversionInfo &Info);
--};
--
--extern TypeConverter *TheTypeConverter;
--
--/// ConvertType - Returns the LLVM type to use for memory that holds a value
--/// of the given GCC type (GetRegType should be used for values in registers).
--inline const Type *ConvertType(tree_node *type) {
--  return TheTypeConverter->ConvertType(type);
--}
--
--/// getDefaultValue - Return the default value to use for a constant or global
--/// that has no value specified.  For example in C like languages such variables
--/// are initialized to zero, while in Ada they hold an undefined value.
--inline Constant *getDefaultValue(const Type *Ty) {
--  return flag_default_initialize_globals ?
--    Constant::getNullValue(Ty) : UndefValue::get(Ty);
--}
--
--/// GetUnitType - Returns an integer one address unit wide if 'NumUnits' is 1;
--/// otherwise returns an array of such integers with 'NumUnits' elements.  For
--/// example, on a machine which has 16 bit bytes returns an i16 or an array of
--/// i16.
--extern const Type *GetUnitType(LLVMContext &C, unsigned NumUnits = 1);
--
--/// GetUnitPointerType - Returns an LLVM pointer type which points to memory one
--/// address unit wide.  For example, on a machine which has 16 bit bytes returns
--/// an i16*.
--extern const Type *GetUnitPointerType(LLVMContext &C, unsigned AddrSpace = 0);
--
--/// GetFieldIndex - Return the index of the field in the given LLVM type that
--/// corresponds to the GCC field declaration 'decl'.  This means that the LLVM
--/// and GCC fields start in the same byte (if 'decl' is a bitfield, this means
--/// that its first bit is within the byte the LLVM field starts at).  Returns
--/// INT_MAX if there is no such LLVM field.
--int GetFieldIndex(tree_node *decl, const Type *Ty);
--
--/// getINTEGER_CSTVal - Return the specified INTEGER_CST value as a uint64_t.
--///
--uint64_t getINTEGER_CSTVal(tree_node *exp);
--
--/// isInt64 - Return true if t is an INTEGER_CST that fits in a 64 bit integer.
--/// If Unsigned is false, returns whether it fits in a int64_t.  If Unsigned is
--/// true, returns whether the value is non-negative and fits in a uint64_t.
--/// Always returns false for overflowed constants or if t is NULL.
--bool isInt64(tree_node *t, bool Unsigned);
--
--/// getInt64 - Extract the value of an INTEGER_CST as a 64 bit integer.  If
--/// Unsigned is false, the value must fit in a int64_t.  If Unsigned is true,
--/// the value must be non-negative and fit in a uint64_t.  Must not be used on
--/// overflowed constants.  These conditions can be checked by calling isInt64.
--uint64_t getInt64(tree_node *t, bool Unsigned);
--
--/// isPassedByInvisibleReference - Return true if the specified type should be
--/// passed by 'invisible reference'. In other words, instead of passing the
--/// thing by value, pass the address of a temporary.
--bool isPassedByInvisibleReference(tree_node *type);
--
--/// isSequentialCompatible - Return true if the specified gcc array or pointer
--/// type and the corresponding LLVM SequentialType lay out their components
--/// identically in memory, so doing a GEP accesses the right memory location.
--/// We assume that objects without a known size do not.
--extern bool isSequentialCompatible(tree_node *type);
--
--/// OffsetIsLLVMCompatible - Return true if the given field is offset from the
--/// start of the record by a constant amount which is not humongously big.
--extern bool OffsetIsLLVMCompatible(tree_node *field_decl);
--
--/// ArrayLengthOf - Returns the length of the given gcc array type, or ~0ULL if
--/// the array has variable or unknown length.
--extern uint64_t ArrayLengthOf(tree_node *type);
--
--/// isBitfield - Returns whether to treat the specified field as a bitfield.
--bool isBitfield(tree_node *field_decl);
--
--/// getFieldOffsetInBits - Return the bit offset of a FIELD_DECL in a structure.
--extern uint64_t getFieldOffsetInBits(tree_node *field);
--
--/// ValidateRegisterVariable - Check that a static "asm" variable is
--/// well-formed.  If not, emit error messages and return true.  If so, return
--/// false.
--bool ValidateRegisterVariable(tree_node *decl);
--
--/// MemRef - This struct holds the information needed for a memory access:
--/// a pointer to the memory, its alignment and whether the access is volatile.
--class MemRef {
--public:
--  Value *Ptr;
--  bool Volatile;
--private:
--  unsigned char LogAlign;
--public:
--  explicit MemRef() : Ptr(0), Volatile(false), LogAlign(0) {}
--  explicit MemRef(Value *P, uint32_t A, bool V) : Ptr(P), Volatile(V) {
--    // Forbid alignment 0 along with non-power-of-2 alignment values.
--    assert(isPowerOf2_32(A) && "Alignment not a power of 2!");
--    LogAlign = Log2_32(A);
--  }
--
--  uint32_t getAlignment() const {
--    return 1U << LogAlign;
--  }
--
--  void setAlignment(uint32_t A) {
--    LogAlign = Log2_32(A);
--  }
--};
--
--/// LValue - This struct represents an lvalue in the program.  In particular,
--/// the Ptr member indicates the memory that the lvalue lives in.  Alignment
--/// is the alignment of the memory (in bytes).If this is a bitfield reference,
--/// BitStart indicates the first bit in the memory that is part of the field
--/// and BitSize indicates the extent.
--///
--/// "LValue" is intended to be a light-weight object passed around by-value.
--class LValue : public MemRef {
--public:
--  unsigned char BitStart;
--  unsigned char BitSize;
--public:
--  explicit LValue() : BitStart(255), BitSize(255) {}
--  explicit LValue(MemRef &M) : MemRef(M), BitStart(255), BitSize(255) {}
--  LValue(Value *P, uint32_t A, bool V = false) :
--      MemRef(P, A, V), BitStart(255), BitSize(255) {}
--  LValue(Value *P, uint32_t A, unsigned BSt, unsigned BSi, bool V = false) :
--      MemRef(P, A, V), BitStart(BSt), BitSize(BSi) {
--    assert(BitStart == BSt && BitSize == BSi &&
--           "Bit values larger than 256?");
--  }
--
--  bool isBitfield() const { return BitStart != 255; }
--};
--
--/// PhiRecord - This struct holds the LLVM PHI node associated with a GCC phi.
--struct PhiRecord {
--  gimple_statement_d *gcc_phi;
--  PHINode *PHI;
--};
--
--/// TreeToLLVM - An instance of this class is created and used to convert the
--/// body of each function to LLVM.
--///
--class TreeToLLVM {
--  // State that is initialized when the function starts.
--  const DataLayout &TD;
--  tree_node *FnDecl;
--  Function *Fn;
--  BasicBlock *ReturnBB;
--  unsigned ReturnOffset;
--
--  // State that changes as the function is emitted.
--
--  /// Builder - Instruction creator, the location to insert into is always the
--  /// same as &Fn->back().
--  LLVMBuilder Builder;
--
--  // AllocaInsertionPoint - Place to insert alloca instructions.  Lazily created
--  // and managed by CreateTemporary.
--  Instruction *AllocaInsertionPoint;
--
--  // SSAInsertionPoint - Place to insert reads corresponding to SSA default
--  // definitions.
--  Instruction *SSAInsertionPoint;
--
--  /// BasicBlocks - Map from GCC to LLVM basic blocks.
--  DenseMap<basic_block_def *, BasicBlock*> BasicBlocks;
--
--  /// LocalDecls - Map from local declarations to their associated LLVM values.
--  DenseMap<tree_node *, AssertingVH<Value> > LocalDecls;
--
--  /// PendingPhis - Phi nodes which have not yet been populated with operands.
--  SmallVector<PhiRecord, 16> PendingPhis;
--
--  // SSANames - Map from GCC ssa names to the defining LLVM value.
--  DenseMap<tree_node *, TrackingVH<Value> > SSANames;
--
--public:
--
--  //===---------------------- Local Declarations --------------------------===//
--
--  /// DECL_LOCAL - Like DECL_LLVM, returns the LLVM declaration of a variable or
--  /// function.  However DECL_LOCAL can be used with declarations local to the
--  /// current function as well as with global declarations.
--  Value *make_decl_local(tree_node *);
--  #define DECL_LOCAL(NODE) make_decl_local(NODE)
--
--  /// DEFINITION_LOCAL - Like DEFINITION_LLVM, ensures that the initial value or
--  /// body of a variable or function will be output.  However DEFINITION_LOCAL
--  /// can be used with declarations local to the current function as well as
--  /// with global declarations.
--  Value *make_definition_local(tree_node *);
--  #define DEFINITION_LOCAL(NODE) make_definition_local(NODE)
--
--  /// SET_DECL_LOCAL - Set the DECL_LOCAL for NODE to LLVM.
--  Value *set_decl_local(tree_node *, Value *);
--  #define SET_DECL_LOCAL(NODE, LLVM) set_decl_local(NODE, LLVM)
--
--  /// DECL_LOCAL_IF_SET - The DECL_LOCAL for NODE, if it is set, or NULL, if it
--  /// is not set.
--  Value *get_decl_local(tree_node *);
--  #define DECL_LOCAL_IF_SET(NODE) (HAS_RTL_P(NODE) ? get_decl_local(NODE) : NULL)
--
--  /// DECL_LOCAL_SET_P - Returns nonzero if the DECL_LOCAL for NODE has already
--  /// been set.
--  #define DECL_LOCAL_SET_P(NODE) (DECL_LOCAL_IF_SET(NODE) != NULL)
--
--
--private:
--
--  //===---------------------- Exception Handling --------------------------===//
--
--  /// NormalInvokes - Mapping from landing pad number to the set of invoke
--  /// instructions that unwind to that landing pad.
--  SmallVector<SmallVector<InvokeInst *, 8>, 16> NormalInvokes;
--
--  /// ExceptionPtrs - Mapping from EH region index to the local holding the
--  /// exception pointer for that region.
--  SmallVector<AllocaInst *, 16> ExceptionPtrs;
--
--  /// ExceptionFilters - Mapping from EH region index to the local holding the
--  /// filter value for that region.
--  SmallVector<AllocaInst *, 16> ExceptionFilters;
--
--  /// FailureBlocks - Mapping from the index of a must-not-throw EH region to
--  /// the block containing the failure code for the region (the code that is
--  /// run if an exception is thrown in this region).
--  SmallVector<BasicBlock *, 16> FailureBlocks;
--
--  /// RewindBB - Block containing code that continues unwinding an exception.
--  BasicBlock *RewindBB;
--
--  /// RewindTmp - Local holding the exception to continue unwinding.
--  AllocaInst *RewindTmp;
--
--public:
--  TreeToLLVM(tree_node *fndecl);
--  ~TreeToLLVM();
--
--  /// getFUNCTION_DECL - Return the FUNCTION_DECL node for the current function
--  /// being compiled.
--  tree_node *getFUNCTION_DECL() const { return FnDecl; }
--
--  /// EmitFunction - Convert 'fndecl' to LLVM code.
--  Function *EmitFunction();
--
--  /// EmitBasicBlock - Convert the given basic block.
--  void EmitBasicBlock(basic_block_def *bb);
--
--  /// EmitLV - Convert the specified l-value tree node to LLVM code, returning
--  /// the address of the result.
--  LValue EmitLV(tree_node *exp);
--
--  void TODO(tree_node *exp = 0);
--
--  /// CastToAnyType - Cast the specified value to the specified type regardless
--  /// of the types involved. This is an inferred cast.
--  Value *CastToAnyType (Value *V, bool VSigned, const Type *Ty, bool TySigned);
--
--  /// CastToUIntType - Cast the specified value to the specified type assuming
--  /// that V's type and Ty are integral types. This arbitrates between BitCast,
--  /// Trunc and ZExt.
--  Value *CastToUIntType(Value *V, const Type *Ty);
--
--  /// CastToSIntType - Cast the specified value to the specified type assuming
--  /// that V's type and Ty are integral types. This arbitrates between BitCast,
--  /// Trunc and SExt.
--  Value *CastToSIntType(Value *V, const Type *Ty);
--
--  /// CastToFPType - Cast the specified value to the specified type assuming
--  /// that V's type and Ty are floating point types. This arbitrates between
--  /// BitCast, FPTrunc and FPExt.
--  Value *CastToFPType(Value *V, const Type *Ty);
--
--  /// CreateAnyAdd - Add two LLVM scalar values with the given GCC type.  Does
--  /// not support complex numbers.  The type is used to set overflow flags.
--  Value *CreateAnyAdd(Value *LHS, Value *RHS, tree_node *type);
--
--  /// CreateAnyMul - Multiply two LLVM scalar values with the given GCC type.
--  /// Does not support complex numbers.  The type is used to set overflow flags.
--  Value *CreateAnyMul(Value *LHS, Value *RHS, tree_node *type);
--
--  /// CreateAnyNeg - Negate an LLVM scalar value with the given GCC type.  Does
--  /// not support complex numbers.  The type is used to set overflow flags.
--  Value *CreateAnyNeg(Value *V, tree_node *type);
--
--  /// CreateAnySub - Subtract two LLVM scalar values with the given GCC type.
--  /// Does not support complex numbers.
--  Value *CreateAnySub(Value *LHS, Value *RHS, tree_node *type);
--
--  /// CreateTemporary - Create a new alloca instruction of the specified type,
--  /// inserting it into the entry block and returning it.  The resulting
--  /// instruction's type is a pointer to the specified type.
--  AllocaInst *CreateTemporary(const Type *Ty, unsigned align=0);
--
--  /// CreateTempLoc - Like CreateTemporary, but returns a MemRef.
--  MemRef CreateTempLoc(const Type *Ty);
--
--  /// EmitAggregateCopy - Copy the elements from SrcLoc to DestLoc, using the
--  /// GCC type specified by GCCType to know which elements to copy.
--  void EmitAggregateCopy(MemRef DestLoc, MemRef SrcLoc, tree_node *GCCType);
--
--  /// EmitAggregate - Store the specified tree node into the location given by
--  /// DestLoc.
--  void EmitAggregate(tree_node *exp, const MemRef &DestLoc);
--
--private: // Helper functions.
--
--  /// StartFunctionBody - Start the emission of 'fndecl', outputing all
--  /// declarations for parameters and setting things up.
--  void StartFunctionBody();
--
--  /// FinishFunctionBody - Once the body of the function has been emitted, this
--  /// cleans up and returns the result function.
--  Function *FinishFunctionBody();
--
--  /// PopulatePhiNodes - Populate generated phi nodes with their operands.
--  void PopulatePhiNodes();
--
--  /// getBasicBlock - Find or create the LLVM basic block corresponding to BB.
--  BasicBlock *getBasicBlock(basic_block_def *bb);
--
--  /// getLabelDeclBlock - Lazily get and create a basic block for the specified
--  /// label.
--  BasicBlock *getLabelDeclBlock(tree_node *LabelDecl);
--
--  /// DefineSSAName - Use the given value as the definition of the given SSA
--  /// name.  Returns the provided value as a convenience.
--  Value *DefineSSAName(tree_node *reg, Value *Val);
--
--  /// BeginBlock - Add the specified basic block to the end of the function.  If
--  /// the previous block falls through into it, add an explicit branch.
--  void BeginBlock(BasicBlock *BB);
--
--  /// EmitAggregateZero - Zero the elements of DestLoc.
--  void EmitAggregateZero(MemRef DestLoc, tree_node *GCCType);
--
--  /// EmitMemCpy/EmitMemMove/EmitMemSet - Emit an llvm.memcpy/llvm.memmove or
--  /// llvm.memset call with the specified operands.  Returns DestPtr bitcast
--  /// to i8*.
--  Value *EmitMemCpy(Value *DestPtr, Value *SrcPtr, Value *Size, unsigned Align);
--  Value *EmitMemMove(Value *DestPtr, Value *SrcPtr, Value *Size, unsigned Align);
--  Value *EmitMemSet(Value *DestPtr, Value *SrcVal, Value *Size, unsigned Align);
--
--  /// EmitLandingPads - Emit EH landing pads.
--  void EmitLandingPads();
--
--  /// EmitFailureBlocks - Emit the blocks containing failure code executed when
--  /// an exception is thrown in a must-not-throw region.
--  void EmitFailureBlocks();
--
--  /// EmitRewindBlock - Emit the block containing code to continue unwinding an
--  /// exception.
--  void EmitRewindBlock();
--
--  /// EmitDebugInfo - Return true if debug info is to be emitted for current
--  /// function.
--  bool EmitDebugInfo();
--
--private: // Helpers for exception handling.
--
--  /// getLandingPad - Return the landing pad for the given exception handling
--  /// region, creating it if necessary.
--  BasicBlock *getLandingPad(unsigned RegionNo);
--
--  /// getExceptionPtr - Return the local holding the exception pointer for the
--  /// given exception handling region, creating it if necessary.
--  AllocaInst *getExceptionPtr(unsigned RegionNo);
--
--  /// getExceptionFilter - Return the local holding the filter value for the
--  /// given exception handling region, creating it if necessary.
--  AllocaInst *getExceptionFilter(unsigned RegionNo);
--
--  /// getFailureBlock - Return the basic block containing the failure code for
--  /// the given exception handling region, creating it if necessary.
--  BasicBlock *getFailureBlock(unsigned RegionNo);
--
--private:
--  void EmitAutomaticVariableDecl(tree_node *decl);
--
--  /// EmitAnnotateIntrinsic - Emits call to annotate attr intrinsic
--  void EmitAnnotateIntrinsic(Value *V, tree_node *decl);
--
--  /// EmitTypeGcroot - Emits call to make type a gcroot
--  void EmitTypeGcroot(Value *V);
--
--private:
--
--  //===------------------ Render* - Convert GIMPLE to LLVM ----------------===//
--
--  void RenderGIMPLE_ASM(gimple_statement_d *stmt);
--  void RenderGIMPLE_ASSIGN(gimple_statement_d *stmt);
--  void RenderGIMPLE_CALL(gimple_statement_d *stmt);
--  void RenderGIMPLE_COND(gimple_statement_d *stmt);
--  void RenderGIMPLE_EH_DISPATCH(gimple_statement_d *stmt);
--  void RenderGIMPLE_GOTO(gimple_statement_d *stmt);
--  void RenderGIMPLE_RESX(gimple_statement_d *stmt);
--  void RenderGIMPLE_RETURN(gimple_statement_d *stmt);
--  void RenderGIMPLE_SWITCH(gimple_statement_d *stmt);
--
--  // Render helpers.
--
--  /// EmitAssignRHS - Convert the RHS of a scalar GIMPLE_ASSIGN to LLVM.
--  Value *EmitAssignRHS(gimple_statement_d *stmt);
--
--  /// EmitAssignSingleRHS - Helper for EmitAssignRHS.  Handles those RHS that
--  /// are not register expressions.
--  Value *EmitAssignSingleRHS(tree_node *rhs);
--
--  /// OutputCallRHS - Convert the RHS of a GIMPLE_CALL.
--  Value *OutputCallRHS(gimple_statement_d *stmt, const MemRef *DestLoc);
--
--  /// WriteScalarToLHS - Store RHS, a non-aggregate value, into the given LHS.
--  void WriteScalarToLHS(tree_node *lhs, Value *Scalar);
--
--private:
--
--  //===---------- EmitReg* - Convert register expression to LLVM ----------===//
--
--  /// GetRegType - Returns the LLVM type to use for registers that hold a value
--  /// of the scalar GCC type 'type'.  All of the EmitReg* routines use this to
--  /// determine the LLVM type to return.
--  const Type *GetRegType(tree_node *type);
--
--  /// UselesslyTypeConvert - The useless_type_conversion_p predicate implicitly
--  /// defines the GCC middle-end type system.  For scalar GCC types inner_type
--  /// and outer_type, if 'useless_type_conversion_p(outer_type, inner_type)' is
--  /// true then the corresponding LLVM inner and outer types (see GetRegType)
--  /// are equal except possibly if they are both pointer types (casts to 'void*'
--  /// are considered useless for example) or types derived from pointer types
--  /// (vector types with pointer element type are the only possibility here).
--  /// This method converts LLVM values of the inner type to the outer type.
--  Value *UselesslyTypeConvert(Value *V, const Type *Ty) {
--    return Builder.CreateBitCast(V, Ty);
--  }
--
--  /// EmitRegister - Convert the specified gimple register or local constant of
--  /// register type to an LLVM value.  Only creates code in the entry block.
--  Value *EmitRegister(tree_node *reg);
--
--  /// EmitReg_SSA_NAME - Return the defining value of the given SSA_NAME.
--  /// Only creates code in the entry block.
--  Value *EmitReg_SSA_NAME(tree_node *reg);
--
--  // Unary expressions.
--  Value *EmitReg_ABS_EXPR(tree_node *op);
--  Value *EmitReg_BIT_NOT_EXPR(tree_node *op);
--  Value *EmitReg_CONJ_EXPR(tree_node *op);
--  Value *EmitReg_CONVERT_EXPR(tree_node *type, tree_node *op);
--  Value *EmitReg_NEGATE_EXPR(tree_node *op);
--  Value *EmitReg_PAREN_EXPR(tree_node *exp);
--  Value *EmitReg_TRUTH_NOT_EXPR(tree_node *type, tree_node *op);
--
--  // Comparisons.
--
--  /// EmitCompare - Compare LHS with RHS using the appropriate comparison code.
--  /// The result is an i1 boolean.
--  Value *EmitCompare(tree_node *lhs, tree_node *rhs, unsigned code);
--
--  // Binary expressions.
--  Value *EmitReg_MinMaxExpr(tree_node *type, tree_node *op0, tree_node *op1,
--                            unsigned UIPred, unsigned SIPred, unsigned Opc,
--                            bool isMax);
--  Value *EmitReg_RotateOp(tree_node *type, tree_node *op0, tree_node *op1,
--                          unsigned Opc1, unsigned Opc2);
--  Value *EmitReg_ShiftOp(tree_node *op0, tree_node *op1, unsigned Opc);
--  Value *EmitReg_TruthOp(tree_node *type, tree_node *op0, tree_node *op1,
--                         unsigned Opc);
--  Value *EmitReg_BIT_AND_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_BIT_IOR_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_BIT_XOR_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_CEIL_DIV_EXPR(tree_node *type, tree_node *op0, tree_node *op1);
--  Value *EmitReg_COMPLEX_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_FLOOR_DIV_EXPR(tree_node *type, tree_node *op0,
--                                tree_node *op1);
--  Value *EmitReg_FLOOR_MOD_EXPR(tree_node *type, tree_node *op0,
--                                tree_node *op1);
--  Value *EmitReg_MINUS_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_MULT_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_PLUS_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_POINTER_PLUS_EXPR(tree_node *type, tree_node *op0,
--                                   tree_node *op1);
--  Value *EmitReg_RDIV_EXPR(tree_node *op0, tree_node *op1);
--  Value *EmitReg_ROUND_DIV_EXPR(tree_node *type, tree_node *op0,
--                                tree_node *op1);
--  Value *EmitReg_TRUNC_DIV_EXPR(tree_node *op0, tree_node *op1, bool isExact);
--  Value *EmitReg_TRUNC_MOD_EXPR(tree_node *op0, tree_node *op1);
--
--  Value *EmitLoadOfLValue(tree_node *exp);
--  Value *EmitOBJ_TYPE_REF(tree_node *exp);
--  Value *EmitADDR_EXPR(tree_node *exp);
--  Value *EmitCallOf(Value *Callee, gimple_statement_d *stmt,
--                    const MemRef *DestLoc, const AttrListPtr &PAL);
--  CallInst *EmitSimpleCall(StringRef CalleeName, tree_node *ret_type,
--                           /* arguments */ ...) END_WITH_NULL;
--  Value *EmitFieldAnnotation(Value *FieldPtr, tree_node *FieldDecl);
--
--  // Inline Assembly and Register Variables.
--  Value *EmitReadOfRegisterVariable(tree_node *vardecl);
--  void EmitModifyOfRegisterVariable(tree_node *vardecl, Value *RHS);
--
--  // Helpers for Builtin Function Expansion.
--  void EmitMemoryBarrier(bool ll, bool ls, bool sl, bool ss, bool device);
--  Value *BuildVector(const std::vector<Value*> &Elts);
--  Value *BuildVector(Value *Elt, ...);
--  Value *BuildVectorShuffle(Value *InVec1, Value *InVec2, ...);
--  Value *BuildBinaryAtomicBuiltin(gimple_statement_d *stmt, Intrinsic::ID id);
--  Value *BuildCmpAndSwapAtomicBuiltin(gimple_statement_d *stmt, tree_node *type,
--                                      bool isBool);
--
--  // Builtin Function Expansion.
--  bool EmitBuiltinCall(gimple_statement_d *stmt, tree_node *fndecl,
--                       const MemRef *DestLoc, Value *&Result);
--  bool EmitFrontendExpandedBuiltinCall(gimple_statement_d *stmt,
--                                       tree_node *fndecl, const MemRef *DestLoc,
--                                       Value *&Result);
--  bool EmitBuiltinUnaryOp(Value *InVal, Value *&Result, Intrinsic::ID Id);
--  Value *EmitBuiltinSQRT(gimple_statement_d *stmt);
--  Value *EmitBuiltinPOWI(gimple_statement_d *stmt);
--  Value *EmitBuiltinPOW(gimple_statement_d *stmt);
--  Value *EmitBuiltinLCEIL(gimple_statement_d *stmt);
--  Value *EmitBuiltinLFLOOR(gimple_statement_d *stmt);
--
--  bool EmitBuiltinConstantP(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinAlloca(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinExpect(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinExtendPointer(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinVAStart(gimple_statement_d *stmt);
--  bool EmitBuiltinVAEnd(gimple_statement_d *stmt);
--  bool EmitBuiltinVACopy(gimple_statement_d *stmt);
--  bool EmitBuiltinMemCopy(gimple_statement_d *stmt, Value *&Result,
--                          bool isMemMove, bool SizeCheck);
--  bool EmitBuiltinMemSet(gimple_statement_d *stmt, Value *&Result,
--                         bool SizeCheck);
--  bool EmitBuiltinBZero(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinPrefetch(gimple_statement_d *stmt);
--  bool EmitBuiltinReturnAddr(gimple_statement_d *stmt, Value *&Result,
--                             bool isFrame);
--  bool EmitBuiltinExtractReturnAddr(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinFrobReturnAddr(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinStackSave(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinStackRestore(gimple_statement_d *stmt);
--  bool EmitBuiltinEHPointer(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinDwarfCFA(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinDwarfSPColumn(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinEHReturnDataRegno(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinEHReturn(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinInitDwarfRegSizes(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinUnwindInit(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinAdjustTrampoline(gimple_statement_d *stmt, Value *&Result);
--  bool EmitBuiltinInitTrampoline(gimple_statement_d *stmt, Value *&Result);
--
--  // Complex Math Expressions.
--  Value *CreateComplex(Value *Real, Value *Imag, tree_node *elt_type);
--  void SplitComplex(Value *Complex, Value *&Real, Value *&Imag,
--                    tree_node *elt_type);
--
--  // L-Value Expressions.
--  LValue EmitLV_ARRAY_REF(tree_node *exp);
--  LValue EmitLV_BIT_FIELD_REF(tree_node *exp);
--  LValue EmitLV_COMPONENT_REF(tree_node *exp);
--  LValue EmitLV_DECL(tree_node *exp);
--  LValue EmitLV_INDIRECT_REF(tree_node *exp);
--  LValue EmitLV_VIEW_CONVERT_EXPR(tree_node *exp);
--  LValue EmitLV_WITH_SIZE_EXPR(tree_node *exp);
--  LValue EmitLV_XXXXPART_EXPR(tree_node *exp, unsigned Idx);
--  LValue EmitLV_SSA_NAME(tree_node *exp);
--  LValue EmitLV_TARGET_MEM_REF(tree_node *exp);
--
--  // Constant Expressions.
--  Value *EmitINTEGER_CST(tree_node *exp);
--  Value *EmitREAL_CST(tree_node *exp);
--  Value *EmitCONSTRUCTOR(tree_node *exp, const MemRef *DestLoc);
--
--
--  // Emit helpers.
--
--  /// EmitMinInvariant - The given value is constant in this function.  Return
--  /// the corresponding LLVM value. Only creates code in the entry block.
--  Value *EmitMinInvariant(tree_node *reg);
--
--  /// EmitInvariantAddress - The given address is constant in this function.
--  /// Return the corresponding LLVM value. Only creates code in the entry block.
--  Value *EmitInvariantAddress(tree_node *addr);
--
--  /// EmitRegisterConstant - Convert the given global constant of register type
--  /// to an LLVM constant.  Creates no code, only constants.
--  Constant *EmitRegisterConstant(tree_node *reg);
--
--  /// EmitComplexRegisterConstant - Turn the given COMPLEX_CST into an LLVM
--  /// constant of the corresponding register type.
--  Constant *EmitComplexRegisterConstant(tree_node *reg);
--
--  /// EmitIntegerRegisterConstant - Turn the given INTEGER_CST into an LLVM
--  /// constant of the corresponding register type.
--  Constant *EmitIntegerRegisterConstant(tree_node *reg);
--
--  /// EmitRealRegisterConstant - Turn the given REAL_CST into an LLVM constant
--  /// of the corresponding register type.
--  Constant *EmitRealRegisterConstant(tree_node *reg);
--
--  /// EmitConstantVectorConstructor - Turn the given constant CONSTRUCTOR into
--  /// an LLVM constant of the corresponding vector register type.
--  Constant *EmitConstantVectorConstructor(tree_node *reg);
--
--  /// EmitVectorRegisterConstant - Turn the given VECTOR_CST into an LLVM
--  /// constant of the corresponding register type.
--  Constant *EmitVectorRegisterConstant(tree_node *reg);
--
--  /// Mem2Reg - Convert a value of in-memory type (that given by ConvertType)
--  /// to in-register type (that given by GetRegType).  TODO: Eliminate these
--  /// methods: "memory" values should never be held in registers.  Currently
--  /// this is mainly used for marshalling function parameters and return values,
--  /// but that should be completely independent of the reg vs mem value logic.
--  Value *Mem2Reg(Value *V, tree_node *type, LLVMBuilder &Builder);
--  Constant *Mem2Reg(Constant *C, tree_node *type, TargetFolder &Folder);
--
--  /// Reg2Mem - Convert a value of in-register type (that given by GetRegType)
--  /// to in-memory type (that given by ConvertType).  TODO: Eliminate this
--  /// method: "memory" values should never be held in registers.  Currently
--  /// this is mainly used for marshalling function parameters and return values,
--  /// but that should be completely independent of the reg vs mem value logic.
--  Value *Reg2Mem(Value *V, tree_node *type, LLVMBuilder &Builder);
--
--  /// EmitMemory - Convert the specified gimple register or local constant of
--  /// register type to an LLVM value with in-memory type (given by ConvertType).
--  /// TODO: Eliminate this method, see Mem2Reg and Reg2Mem above.
--  Value *EmitMemory(tree_node *reg);
--
--  /// LoadRegisterFromMemory - Loads a value of the given scalar GCC type from
--  /// the memory location pointed to by Loc.  Takes care of adjusting for any
--  /// differences between in-memory and in-register types (the returned value
--  /// is of in-register type, as returned by GetRegType).
--  Value *LoadRegisterFromMemory(MemRef Loc, tree_node *type,
--                                LLVMBuilder &Builder);
--
--  /// StoreRegisterToMemory - Stores the given value to the memory pointed to by
--  /// Loc.  Takes care of adjusting for any differences between the value's type
--  /// (which is the in-register type given by GetRegType) and the in-memory type.
--  void StoreRegisterToMemory(Value *V, MemRef Loc, tree_node *type,
--                             LLVMBuilder &Builder);
--
--private:
--  // Optional target defined builtin intrinsic expanding function.
--  bool TargetIntrinsicLower(gimple_statement_d *stmt,
--                            tree_node *fndecl,
--                            const MemRef *DestLoc,
--                            Value *&Result,
--                            const Type *ResultType,
--                            std::vector<Value*> &Ops);
--
--public:
--  // Helper for taking the address of a label.
--  Constant *AddressOfLABEL_DECL(tree_node *exp);
--};
--
--#endif /* DRAGONEGG_INTERNALS_H */
-diff -r -u -N dragonegg-2.9-old/linux/dragonegg/OS.h dragonegg-2.9-new/linux/dragonegg/OS.h
---- dragonegg-2.9-old/linux/dragonegg/OS.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/linux/dragonegg/OS.h	2011-04-09 00:38:11.339997171 +0200
-@@ -0,0 +1,33 @@
-+//===------------- OS.h - Linux specific definitions ------------*- C++ -*-===//
-+//
-+// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file provides Linux specific declarations.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_OS_H
-+#define DRAGONEGG_OS_H
-+
-+/* Yes, we support PIC codegen for linux targets! */
-+#define LLVM_SET_TARGET_OPTIONS(argvec)              \
-+  if (flag_pic)                                      \
-+    argvec.push_back ("--relocation-model=pic");     \
-+  else                                               \
-+    argvec.push_back ("--relocation-model=static");
-+
-+#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/linux/OS.h dragonegg-2.9-new/linux/OS.h
---- dragonegg-2.9-old/linux/OS.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/linux/OS.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,33 +0,0 @@
--//===------------- OS.h - Linux specific definitions ------------*- C++ -*-===//
--//
--// Copyright (C) 2009, 2010, 2011  Duncan Sands et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file provides Linux specific declarations.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_OS_H
--#define DRAGONEGG_OS_H
--
--/* Yes, we support PIC codegen for linux targets! */
--#define LLVM_SET_TARGET_OPTIONS(argvec)              \
--  if (flag_pic)                                      \
--    argvec.push_back ("--relocation-model=pic");     \
--  else                                               \
--    argvec.push_back ("--relocation-model=static");
--
--#endif /* DRAGONEGG_OS_H */
-diff -r -u -N dragonegg-2.9-old/Makefile dragonegg-2.9-new/Makefile
---- dragonegg-2.9-old/Makefile	2011-03-28 21:44:58.000000000 +0200
-+++ dragonegg-2.9-new/Makefile	2011-04-09 00:38:11.339997171 +0200
-@@ -52,7 +52,7 @@
- 	     -MD -MP \
- 	     -DIN_GCC -DREVISION=\"$(REVISION)\" \
- 	     -DGCC_MAJOR=$(GCC_MAJOR) -DGCC_MINOR=$(GCC_MINOR) \
--	     -I$(SRC_DIR) -I$(SRC_DIR)/ADT -I$(GCC_PLUGIN_DIR)/include
-+	     -I$(SRC_DIR)/include -I$(GCC_PLUGIN_DIR)/include
- 
- LD_OPTIONS+=$(shell $(LLVM_CONFIG) --ldflags) $(LDFLAGS)
- 
-diff -r -u -N dragonegg-2.9-old/Trees.cpp dragonegg-2.9-new/Trees.cpp
---- dragonegg-2.9-old/Trees.cpp	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/Trees.cpp	2011-04-09 00:38:11.339997171 +0200
-@@ -21,7 +21,7 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "Trees.h"
-+#include "dragonegg/Trees.h"
- 
- // LLVM headers
- #include "llvm/ADT/Twine.h"
-diff -r -u -N dragonegg-2.9-old/Trees.h dragonegg-2.9-new/Trees.h
---- dragonegg-2.9-old/Trees.h	2011-03-29 12:46:17.000000000 +0200
-+++ dragonegg-2.9-new/Trees.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,44 +0,0 @@
--//=---- Trees.h - Utility functions for working with GCC trees ----*- C++ -*-=//
--//
--// Copyright (C) 2010, 2011  Duncan Sands.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares utility functions for working with GCC trees.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_TREES_H
--#define DRAGONEGG_TREES_H
--
--// System headers
--#include <string>
--
--union tree_node;
--
--/// getDescriptiveName - Return a helpful name for the given tree, or an empty
--/// string if no sensible name was found.  These names are used to make the IR
--/// more readable, and have no official status.
--std::string getDescriptiveName(union tree_node *t);
--
--/// hasNUW - Return whether overflowing unsigned operations on this type result
--/// in undefined behaviour.
--bool hasNUW(tree_node *type);
--
--/// hasNSW - Return whether overflowing signed operations on this type result
--/// in undefined behaviour.
--bool hasNSW(tree_node *type);
--
--#endif /* DRAGONEGG_TREES_H */
-diff -r -u -N dragonegg-2.9-old/Types.cpp dragonegg-2.9-new/Types.cpp
---- dragonegg-2.9-old/Types.cpp	2011-03-29 08:26:30.000000000 +0200
-+++ dragonegg-2.9-new/Types.cpp	2011-04-09 00:38:11.349996956 +0200
-@@ -22,10 +22,10 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "ABI.h"
--#include "Trees.h"
-+#include "dragonegg/ABI.h"
-+#include "dragonegg/Trees.h"
- extern "C" {
--#include "cache.h"
-+#include "dragonegg/cache.h"
- }
- 
- // LLVM headers
-diff -r -u -N dragonegg-2.9-old/unknown/dragonegg/OS.h dragonegg-2.9-new/unknown/dragonegg/OS.h
---- dragonegg-2.9-old/unknown/dragonegg/OS.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/unknown/dragonegg/OS.h	2011-04-09 00:38:11.349996956 +0200
-@@ -0,0 +1 @@
-+#error Unknown target operating system
-diff -r -u -N dragonegg-2.9-old/unknown/OS.h dragonegg-2.9-new/unknown/OS.h
---- dragonegg-2.9-old/unknown/OS.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/unknown/OS.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1 +0,0 @@
--#error Unknown target operating system
-diff -r -u -N dragonegg-2.9-old/x86/dragonegg/Target.h dragonegg-2.9-new/x86/dragonegg/Target.h
---- dragonegg-2.9-old/x86/dragonegg/Target.h	1970-01-01 01:00:00.000000000 +0100
-+++ dragonegg-2.9-new/x86/dragonegg/Target.h	2011-04-09 00:38:11.349996956 +0200
-@@ -0,0 +1,403 @@
-+//==----- Target.h - Target hooks for GCC to LLVM conversion -----*- C++ -*-==//
-+//
-+// Copyright (C) 2007, 2008, 2009, 2010, 2011  Anton Korobeynikov, Duncan Sands
-+// et al.
-+//
-+// This file is part of DragonEgg.
-+//
-+// DragonEgg is free software; you can redistribute it and/or modify it under
-+// the terms of the GNU General Public License as published by the Free Software
-+// Foundation; either version 2, or (at your option) any later version.
-+//
-+// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
-+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-+// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-+//
-+// You should have received a copy of the GNU General Public License along with
-+// DragonEgg; see the file COPYING.  If not, write to the Free Software
-+// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
-+//
-+//===----------------------------------------------------------------------===//
-+// This file declares some target-specific hooks for GCC to LLVM conversion.
-+//===----------------------------------------------------------------------===//
-+
-+#ifndef DRAGONEGG_TARGET_H
-+#define DRAGONEGG_TARGET_H
-+
-+/* LLVM specific stuff for supporting calling convention output */
-+#define TARGET_ADJUST_LLVM_CC(CC, type)                         \
-+  {                                                             \
-+    tree_node *type_attributes = TYPE_ATTRIBUTES (type);              \
-+    if (lookup_attribute ("stdcall", type_attributes)) {        \
-+      CC = CallingConv::X86_StdCall;                            \
-+    } else if (lookup_attribute("fastcall", type_attributes)) { \
-+      CC = CallingConv::X86_FastCall;                           \
-+    }                                                           \
-+  }
-+
-+#define TARGET_ADJUST_LLVM_RETATTR(Rattributes, type)           \
-+  {                                                             \
-+    tree_node *type_attributes = TYPE_ATTRIBUTES (type);              \
-+    if (!TARGET_64BIT && (TARGET_SSEREGPARM ||                  \
-+               lookup_attribute("sseregparm", type_attributes)))\
-+      RAttributes |= Attribute::InReg;                          \
-+  }
-+
-+/* LLVM specific stuff for converting gcc's `regparm` attribute to LLVM's
-+   `inreg` parameter attribute */
-+#define LLVM_TARGET_ENABLE_REGPARM
-+
-+extern "C" int ix86_regparm;
-+
-+#define LLVM_TARGET_INIT_REGPARM(local_regparm, local_fp_regparm, type) \
-+  {                                                             \
-+    tree_node *attr;                                                  \
-+    local_regparm = ix86_regparm;                               \
-+    local_fp_regparm = TARGET_SSEREGPARM ? 3 : 0;               \
-+    attr = lookup_attribute ("regparm",                         \
-+                              TYPE_ATTRIBUTES (type));          \
-+    if (attr) {                                                 \
-+      local_regparm = TREE_INT_CST_LOW (TREE_VALUE              \
-+                                        (TREE_VALUE (attr)));   \
-+    }                                                           \
-+    attr = lookup_attribute("sseregparm",                       \
-+                              TYPE_ATTRIBUTES (type));          \
-+    if (attr)                                                   \
-+      local_fp_regparm = 3;                                     \
-+  }
-+
-+#define LLVM_ADJUST_REGPARM_ATTRIBUTE(PAttribute, Type, Size,   \
-+                                      local_regparm,            \
-+                                      local_fp_regparm)         \
-+  {                                                             \
-+    if (!TARGET_64BIT) {                                        \
-+      if (TREE_CODE(Type) == REAL_TYPE &&                       \
-+          (TYPE_PRECISION(Type)==32 ||                          \
-+           TYPE_PRECISION(Type)==64)) {                         \
-+          local_fp_regparm -= 1;                                \
-+          if (local_fp_regparm >= 0)                            \
-+            PAttribute |= Attribute::InReg;                     \
-+          else                                                  \
-+            local_fp_regparm = 0;                               \
-+      } else if (INTEGRAL_TYPE_P(Type) ||                       \
-+                 POINTER_TYPE_P(Type)) {                        \
-+          int words =                                           \
-+                  (Size + BITS_PER_WORD - 1) / BITS_PER_WORD;   \
-+          local_regparm -= words;                               \
-+          if (local_regparm>=0)                                 \
-+            PAttribute |= Attribute::InReg;                     \
-+          else                                                  \
-+            local_regparm = 0;                                  \
-+      }                                                         \
-+    }                                                           \
-+  }
-+
-+#define LLVM_SET_RED_ZONE_FLAG(disable_red_zone)                \
-+  if (TARGET_64BIT && TARGET_NO_RED_ZONE)                       \
-+    disable_red_zone = 1;
-+
-+#ifdef DRAGONEGG_ABI_H
-+
-+/* On x86-32 objects containing SSE vectors are 16 byte aligned, everything
-+   else 4.  On x86-64 vectors are 8-byte aligned, everything else can
-+   be figured out by the back end. */
-+#define LLVM_BYVAL_ALIGNMENT(T) \
-+  (TYPE_ALIGN(T) / 8)
-+
-+extern tree_node *llvm_x86_should_return_selt_struct_as_scalar(tree_node *);
-+
-+/* Structs containing a single data field plus zero-length fields are
-+   considered as if they were the type of the data field.  On x86-64,
-+   if the element type is an MMX vector, return it as double (which will
-+   get it into XMM0). */
-+
-+#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \
-+  llvm_x86_should_return_selt_struct_as_scalar((X))
-+
-+extern bool llvm_x86_should_pass_aggregate_in_integer_regs(tree_node *,
-+                                                           unsigned*, bool*);
-+
-+/* LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS - Return true if this aggregate
-+   value should be passed in integer registers.  This differs from the usual
-+   handling in that x86-64 passes 128-bit structs and unions which only
-+   contain data in the first 64 bits, as 64-bit objects.  (These can be
-+   created by abusing __attribute__((aligned)).  */
-+#define LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(X, Y, Z)             \
-+  llvm_x86_should_pass_aggregate_in_integer_regs((X), (Y), (Z))
-+
-+extern const Type *llvm_x86_scalar_type_for_struct_return(tree_node *type,
-+                                                          unsigned *Offset);
-+
-+/* LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
-+   returned as a scalar, otherwise return NULL. */
-+#define LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN(X, Y) \
-+  llvm_x86_scalar_type_for_struct_return((X), (Y))
-+
-+extern const Type *llvm_x86_aggr_type_for_struct_return(tree_node *type);
-+
-+/* LLVM_AGGR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
-+   returned as an aggregate, otherwise return NULL. */
-+#define LLVM_AGGR_TYPE_FOR_STRUCT_RETURN(X, CC) \
-+  llvm_x86_aggr_type_for_struct_return(X)
-+
-+extern void llvm_x86_extract_multiple_return_value(Value *Src, Value *Dest,
-+                                                   bool isVolatile,
-+                                                   LLVMBuilder &B);
-+
-+/* LLVM_EXTRACT_MULTIPLE_RETURN_VALUE - Extract multiple return value from
-+   SRC and assign it to DEST. */
-+#define LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,V,B)       \
-+  llvm_x86_extract_multiple_return_value((Src),(Dest),(V),(B))
-+
-+extern bool llvm_x86_should_pass_vector_using_byval_attr(tree_node *);
-+
-+/* On x86-64, vectors which are not MMX nor SSE should be passed byval. */
-+#define LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(X)      \
-+  llvm_x86_should_pass_vector_using_byval_attr((X))
-+
-+extern bool llvm_x86_should_pass_vector_in_integer_regs(tree_node *);
-+
-+/* On x86-32, vectors which are not MMX nor SSE should be passed as integers. */
-+#define LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(X)      \
-+  llvm_x86_should_pass_vector_in_integer_regs((X))
-+
-+extern tree_node *llvm_x86_should_return_vector_as_scalar(tree_node *, bool);
-+
-+/* The MMX vector v1i64 is returned in EAX and EDX on Darwin.  Communicate
-+    this by returning i64 here.  Likewise, (generic) vectors such as v2i16
-+    are returned in EAX.
-+    On Darwin x86-64, MMX vectors are returned in XMM0.  Communicate this by
-+    returning f64.  */
-+#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X,isBuiltin)\
-+  llvm_x86_should_return_vector_as_scalar((X), (isBuiltin))
-+
-+extern bool llvm_x86_should_return_vector_as_shadow(tree_node *, bool);
-+
-+/* MMX vectors v2i32, v4i16, v8i8, v2f32 are returned using sret on Darwin
-+   32-bit.  Vectors bigger than 128 are returned using sret.  */
-+#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X,isBuiltin)\
-+  llvm_x86_should_return_vector_as_shadow((X),(isBuiltin))
-+
-+extern bool
-+llvm_x86_should_not_return_complex_in_memory(tree_node *type);
-+
-+/* LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY - A hook to allow
-+   special _Complex handling. Return true if X should be returned using
-+   multiple value return instruction.  */
-+#define LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY(X) \
-+  llvm_x86_should_not_return_complex_in_memory((X))
-+
-+extern bool
-+llvm_x86_should_pass_aggregate_as_fca(tree_node *type, const Type *);
-+
-+/* LLVM_SHOULD_PASS_AGGREGATE_AS_FCA - Return true if an aggregate of the
-+   specified type should be passed as a first-class aggregate. */
-+#ifndef LLVM_SHOULD_PASS_AGGREGATE_AS_FCA
-+#define LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(X, TY) \
-+  llvm_x86_should_pass_aggregate_as_fca(X, TY)
-+#endif
-+
-+extern bool llvm_x86_should_pass_aggregate_in_memory(tree_node *, const Type *);
-+
-+#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY)      \
-+  llvm_x86_should_pass_aggregate_in_memory(X, TY)
-+
-+
-+extern bool
-+llvm_x86_64_should_pass_aggregate_in_mixed_regs(tree_node *, const Type *Ty,
-+                                                std::vector<const Type*>&);
-+extern bool
-+llvm_x86_32_should_pass_aggregate_in_mixed_regs(tree_node *, const Type *Ty,
-+                                                std::vector<const Type*>&);
-+
-+#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E)       \
-+  (TARGET_64BIT ?                                                    \
-+   llvm_x86_64_should_pass_aggregate_in_mixed_regs((T), (TY), (E)) : \
-+   llvm_x86_32_should_pass_aggregate_in_mixed_regs((T), (TY), (E)))
-+
-+extern
-+bool llvm_x86_64_aggregate_partially_passed_in_regs(std::vector<const Type*>&,
-+                                                    std::vector<const Type*>&,
-+                                                    bool);
-+
-+#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC)       \
-+  (TARGET_64BIT ?                                                     \
-+   llvm_x86_64_aggregate_partially_passed_in_regs((E), (SE), (ISR)) : \
-+   false)
-+
-+#endif /* DRAGONEGG_ABI_H */
-+
-+/* Register class used for passing given 64bit part of the argument.
-+   These represent classes as documented by the PS ABI, with the exception
-+   of SSESF, SSEDF classes, that are basically SSE class, just gcc will
-+   use SF or DFmode move instead of DImode to avoid reformatting penalties.
-+
-+   Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
-+   whenever possible (upper half does contain padding).
-+ */
-+enum x86_64_reg_class
-+  {
-+    X86_64_NO_CLASS,
-+    X86_64_INTEGER_CLASS,
-+    X86_64_INTEGERSI_CLASS,
-+    X86_64_SSE_CLASS,
-+    X86_64_SSESF_CLASS,
-+    X86_64_SSEDF_CLASS,
-+    X86_64_SSEUP_CLASS,
-+    X86_64_X87_CLASS,
-+    X86_64_X87UP_CLASS,
-+    X86_64_COMPLEX_X87_CLASS,
-+    X86_64_MEMORY_CLASS
-+  };
-+
-+/* LLVM_TARGET_INTRINSIC_PREFIX - Specify what prefix this target uses for its
-+ * intrinsics.
-+ */
-+#define LLVM_TARGET_INTRINSIC_PREFIX "x86"
-+
-+/* LLVM_TARGET_NAME - This specifies the name of the target, which correlates to
-+ * the llvm::InitializeXXXTarget() function.
-+ */
-+#define LLVM_TARGET_NAME X86
-+
-+/* Turn -march=xx into a CPU type.
-+ */
-+#define LLVM_SET_SUBTARGET_FEATURES(F) \
-+  { if (TARGET_MACHO && ! strcmp (ix86_arch_string, "apple")) \
-+      F.setCPU(TARGET_64BIT ? "core2" : "yonah");             \
-+    else                                                      \
-+      F.setCPU(ix86_arch_string);                             \
-+                                                              \
-+    if (TARGET_64BIT)                                         \
-+      F.AddFeature("64bit");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_64BIT)   \
-+      F.AddFeature("64bit", false);                           \
-+                                                              \
-+    if (TARGET_MMX)                                           \
-+      F.AddFeature("mmx");                                    \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_MMX)     \
-+      F.AddFeature("mmx", false);                             \
-+                                                              \
-+    if (TARGET_3DNOW)                                         \
-+      F.AddFeature("3dnow");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_3DNOW)   \
-+      F.AddFeature("3dnow", false);                           \
-+                                                              \
-+    if (TARGET_3DNOW_A)                                       \
-+      F.AddFeature("3dnowa");                                 \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_3DNOW_A) \
-+      F.AddFeature("3dnowa", false);                          \
-+                                                              \
-+    if (TARGET_SSE)                                           \
-+      F.AddFeature("sse");                                    \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE)     \
-+      F.AddFeature("sse", false);                             \
-+                                                              \
-+    if (TARGET_SSE2)                                          \
-+      F.AddFeature("sse2");                                   \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE2)    \
-+      F.AddFeature("sse2", false);                            \
-+                                                              \
-+    if (TARGET_SSE3)                                          \
-+      F.AddFeature("sse3");                                   \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE3)    \
-+      F.AddFeature("sse3", false);                            \
-+                                                              \
-+    if (TARGET_SSSE3)                                         \
-+      F.AddFeature("ssse3");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSSE3)   \
-+      F.AddFeature("ssse3", false);                           \
-+                                                              \
-+    if (TARGET_SSE4_1)                                        \
-+      F.AddFeature("sse41");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4_1)  \
-+      F.AddFeature("sse41", false);                           \
-+                                                              \
-+    if (TARGET_SSE4_2)                                        \
-+      F.AddFeature("sse42");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4_2)  \
-+      F.AddFeature("sse42", false);                           \
-+                                                              \
-+    if (TARGET_AVX)                                           \
-+      F.AddFeature("avx");                                    \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_AVX)     \
-+      F.AddFeature("avx", false);                             \
-+                                                              \
-+    if (TARGET_FMA)                                           \
-+      F.AddFeature("fma3");                                   \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_FMA)     \
-+      F.AddFeature("fma3", false);                            \
-+                                                              \
-+    if (TARGET_SSE4A)                                         \
-+      F.AddFeature("sse4a");                                  \
-+    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4A)   \
-+      F.AddFeature("sse4a", false);                           \
-+  }
-+
-+#define LLVM_SET_IMPLICIT_FLOAT(flag_no_implicit_float)       \
-+  if (!TARGET_80387)                                          \
-+    flag_no_implicit_float = 1;                               \
-+  else                                                        \
-+    flag_no_implicit_float = 0;
-+
-+/* LLVM ABI definition macros. */
-+
-+/* When -m64 is specified, set the architecture to x86_64-os-blah even if the
-+ * compiler was configured for i[3456]86-os-blah.
-+ */
-+#define LLVM_OVERRIDE_TARGET_ARCH() \
-+  (TARGET_64BIT ? "x86_64" : "i386")
-+
-+/* LLVM_TARGET_INTRINSIC_LOWER - To handle builtins, we want to expand the
-+ * invocation into normal LLVM code.  If the target can handle the builtin, this
-+ * macro should call the target TreeToLLVM::TargetIntrinsicLower method and
-+ *  return true.This macro is invoked from a method in the TreeToLLVM class.
-+ */
-+#define LLVM_TARGET_INTRINSIC_LOWER(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS) \
-+        TargetIntrinsicLower(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS);
-+
-+/* LLVM_GET_REG_NAME - When extracting a register name for a constraint, use
-+   the string extracted from the magic symbol built for that register, rather
-+   than reg_names.  The latter maps both AH and AL to the same thing, which
-+   means we can't distinguish them. */
-+#define LLVM_GET_REG_NAME(REG_NAME, REG_NUM) __extension__ \
-+  ({ const char *nm = (REG_NAME);                          \
-+     if (nm && (*nm == '%' || *nm == '#')) ++nm;           \
-+     ((!nm || ISDIGIT (*nm)) ? reg_names[REG_NUM] : nm); })
-+
-+/* LLVM_CANONICAL_ADDRESS_CONSTRAINTS - Valid x86 memory addresses include
-+   symbolic values and immediates.  Canonicalize GCC's "p" constraint for
-+   memory addresses to allow both memory and immediate operands. */
-+#define LLVM_CANONICAL_ADDRESS_CONSTRAINTS "im"
-+
-+/* Propagate code model setting to backend */
-+#define LLVM_SET_MACHINE_OPTIONS(argvec)                \
-+  do {                                                  \
-+    switch (ix86_cmodel) {                              \
-+    default:                                            \
-+      sorry ("code model %<%s%> not supported yet",     \
-+             ix86_cmodel_string);                       \
-+      break;                                            \
-+    case CM_SMALL:                                      \
-+    case CM_SMALL_PIC:                                  \
-+      argvec.push_back("--code-model=small");           \
-+      break;                                            \
-+    case CM_KERNEL:                                     \
-+      argvec.push_back("--code-model=kernel");          \
-+      break;                                            \
-+    case CM_MEDIUM:                                     \
-+    case CM_MEDIUM_PIC:                                 \
-+      argvec.push_back("--code-model=medium");          \
-+      break;                                            \
-+    case CM_32:                                         \
-+      argvec.push_back("--code-model=default");         \
-+      break;                                            \
-+    }                                                   \
-+    if (TARGET_OMIT_LEAF_FRAME_POINTER)                 \
-+      argvec.push_back("--disable-non-leaf-fp-elim");   \
-+                                                        \
-+    if (ix86_force_align_arg_pointer)                   \
-+      argvec.push_back("-force-align-stack");           \
-+  } while (0)
-+
-+#endif /* DRAGONEGG_TARGET_H */
-diff -r -u -N dragonegg-2.9-old/x86/Target.cpp dragonegg-2.9-new/x86/Target.cpp
---- dragonegg-2.9-old/x86/Target.cpp	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/x86/Target.cpp	2011-04-09 00:38:11.359996741 +0200
-@@ -22,8 +22,8 @@
- //===----------------------------------------------------------------------===//
- 
- // Plugin headers
--#include "ABI.h"
--#include "Target.h"
-+#include "dragonegg/ABI.h"
-+#include "dragonegg/Target.h"
- 
- // LLVM headers
- #include "llvm/Module.h"
-diff -r -u -N dragonegg-2.9-old/x86/Target.h dragonegg-2.9-new/x86/Target.h
---- dragonegg-2.9-old/x86/Target.h	2011-03-10 17:05:54.000000000 +0100
-+++ dragonegg-2.9-new/x86/Target.h	1970-01-01 01:00:00.000000000 +0100
-@@ -1,403 +0,0 @@
--//==----- Target.h - Target hooks for GCC to LLVM conversion -----*- C++ -*-==//
--//
--// Copyright (C) 2007, 2008, 2009, 2010, 2011  Anton Korobeynikov, Duncan Sands
--// et al.
--//
--// This file is part of DragonEgg.
--//
--// DragonEgg is free software; you can redistribute it and/or modify it under
--// the terms of the GNU General Public License as published by the Free Software
--// Foundation; either version 2, or (at your option) any later version.
--//
--// DragonEgg is distributed in the hope that it will be useful, but WITHOUT ANY
--// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
--// A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
--//
--// You should have received a copy of the GNU General Public License along with
--// DragonEgg; see the file COPYING.  If not, write to the Free Software
--// Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
--//
--//===----------------------------------------------------------------------===//
--// This file declares some target-specific hooks for GCC to LLVM conversion.
--//===----------------------------------------------------------------------===//
--
--#ifndef DRAGONEGG_TARGET_H
--#define DRAGONEGG_TARGET_H
--
--/* LLVM specific stuff for supporting calling convention output */
--#define TARGET_ADJUST_LLVM_CC(CC, type)                         \
--  {                                                             \
--    tree_node *type_attributes = TYPE_ATTRIBUTES (type);              \
--    if (lookup_attribute ("stdcall", type_attributes)) {        \
--      CC = CallingConv::X86_StdCall;                            \
--    } else if (lookup_attribute("fastcall", type_attributes)) { \
--      CC = CallingConv::X86_FastCall;                           \
--    }                                                           \
--  }
--
--#define TARGET_ADJUST_LLVM_RETATTR(Rattributes, type)           \
--  {                                                             \
--    tree_node *type_attributes = TYPE_ATTRIBUTES (type);              \
--    if (!TARGET_64BIT && (TARGET_SSEREGPARM ||                  \
--               lookup_attribute("sseregparm", type_attributes)))\
--      RAttributes |= Attribute::InReg;                          \
--  }
--
--/* LLVM specific stuff for converting gcc's `regparm` attribute to LLVM's
--   `inreg` parameter attribute */
--#define LLVM_TARGET_ENABLE_REGPARM
--
--extern "C" int ix86_regparm;
--
--#define LLVM_TARGET_INIT_REGPARM(local_regparm, local_fp_regparm, type) \
--  {                                                             \
--    tree_node *attr;                                                  \
--    local_regparm = ix86_regparm;                               \
--    local_fp_regparm = TARGET_SSEREGPARM ? 3 : 0;               \
--    attr = lookup_attribute ("regparm",                         \
--                              TYPE_ATTRIBUTES (type));          \
--    if (attr) {                                                 \
--      local_regparm = TREE_INT_CST_LOW (TREE_VALUE              \
--                                        (TREE_VALUE (attr)));   \
--    }                                                           \
--    attr = lookup_attribute("sseregparm",                       \
--                              TYPE_ATTRIBUTES (type));          \
--    if (attr)                                                   \
--      local_fp_regparm = 3;                                     \
--  }
--
--#define LLVM_ADJUST_REGPARM_ATTRIBUTE(PAttribute, Type, Size,   \
--                                      local_regparm,            \
--                                      local_fp_regparm)         \
--  {                                                             \
--    if (!TARGET_64BIT) {                                        \
--      if (TREE_CODE(Type) == REAL_TYPE &&                       \
--          (TYPE_PRECISION(Type)==32 ||                          \
--           TYPE_PRECISION(Type)==64)) {                         \
--          local_fp_regparm -= 1;                                \
--          if (local_fp_regparm >= 0)                            \
--            PAttribute |= Attribute::InReg;                     \
--          else                                                  \
--            local_fp_regparm = 0;                               \
--      } else if (INTEGRAL_TYPE_P(Type) ||                       \
--                 POINTER_TYPE_P(Type)) {                        \
--          int words =                                           \
--                  (Size + BITS_PER_WORD - 1) / BITS_PER_WORD;   \
--          local_regparm -= words;                               \
--          if (local_regparm>=0)                                 \
--            PAttribute |= Attribute::InReg;                     \
--          else                                                  \
--            local_regparm = 0;                                  \
--      }                                                         \
--    }                                                           \
--  }
--
--#define LLVM_SET_RED_ZONE_FLAG(disable_red_zone)                \
--  if (TARGET_64BIT && TARGET_NO_RED_ZONE)                       \
--    disable_red_zone = 1;
--
--#ifdef DRAGONEGG_ABI_H
--
--/* On x86-32 objects containing SSE vectors are 16 byte aligned, everything
--   else 4.  On x86-64 vectors are 8-byte aligned, everything else can
--   be figured out by the back end. */
--#define LLVM_BYVAL_ALIGNMENT(T) \
--  (TYPE_ALIGN(T) / 8)
--
--extern tree_node *llvm_x86_should_return_selt_struct_as_scalar(tree_node *);
--
--/* Structs containing a single data field plus zero-length fields are
--   considered as if they were the type of the data field.  On x86-64,
--   if the element type is an MMX vector, return it as double (which will
--   get it into XMM0). */
--
--#define LLVM_SHOULD_RETURN_SELT_STRUCT_AS_SCALAR(X) \
--  llvm_x86_should_return_selt_struct_as_scalar((X))
--
--extern bool llvm_x86_should_pass_aggregate_in_integer_regs(tree_node *,
--                                                           unsigned*, bool*);
--
--/* LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS - Return true if this aggregate
--   value should be passed in integer registers.  This differs from the usual
--   handling in that x86-64 passes 128-bit structs and unions which only
--   contain data in the first 64 bits, as 64-bit objects.  (These can be
--   created by abusing __attribute__((aligned)).  */
--#define LLVM_SHOULD_PASS_AGGREGATE_IN_INTEGER_REGS(X, Y, Z)             \
--  llvm_x86_should_pass_aggregate_in_integer_regs((X), (Y), (Z))
--
--extern const Type *llvm_x86_scalar_type_for_struct_return(tree_node *type,
--                                                          unsigned *Offset);
--
--/* LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
--   returned as a scalar, otherwise return NULL. */
--#define LLVM_SCALAR_TYPE_FOR_STRUCT_RETURN(X, Y) \
--  llvm_x86_scalar_type_for_struct_return((X), (Y))
--
--extern const Type *llvm_x86_aggr_type_for_struct_return(tree_node *type);
--
--/* LLVM_AGGR_TYPE_FOR_STRUCT_RETURN - Return LLVM Type if X can be
--   returned as an aggregate, otherwise return NULL. */
--#define LLVM_AGGR_TYPE_FOR_STRUCT_RETURN(X, CC) \
--  llvm_x86_aggr_type_for_struct_return(X)
--
--extern void llvm_x86_extract_multiple_return_value(Value *Src, Value *Dest,
--                                                   bool isVolatile,
--                                                   LLVMBuilder &B);
--
--/* LLVM_EXTRACT_MULTIPLE_RETURN_VALUE - Extract multiple return value from
--   SRC and assign it to DEST. */
--#define LLVM_EXTRACT_MULTIPLE_RETURN_VALUE(Src,Dest,V,B)       \
--  llvm_x86_extract_multiple_return_value((Src),(Dest),(V),(B))
--
--extern bool llvm_x86_should_pass_vector_using_byval_attr(tree_node *);
--
--/* On x86-64, vectors which are not MMX nor SSE should be passed byval. */
--#define LLVM_SHOULD_PASS_VECTOR_USING_BYVAL_ATTR(X)      \
--  llvm_x86_should_pass_vector_using_byval_attr((X))
--
--extern bool llvm_x86_should_pass_vector_in_integer_regs(tree_node *);
--
--/* On x86-32, vectors which are not MMX nor SSE should be passed as integers. */
--#define LLVM_SHOULD_PASS_VECTOR_IN_INTEGER_REGS(X)      \
--  llvm_x86_should_pass_vector_in_integer_regs((X))
--
--extern tree_node *llvm_x86_should_return_vector_as_scalar(tree_node *, bool);
--
--/* The MMX vector v1i64 is returned in EAX and EDX on Darwin.  Communicate
--    this by returning i64 here.  Likewise, (generic) vectors such as v2i16
--    are returned in EAX.
--    On Darwin x86-64, MMX vectors are returned in XMM0.  Communicate this by
--    returning f64.  */
--#define LLVM_SHOULD_RETURN_VECTOR_AS_SCALAR(X,isBuiltin)\
--  llvm_x86_should_return_vector_as_scalar((X), (isBuiltin))
--
--extern bool llvm_x86_should_return_vector_as_shadow(tree_node *, bool);
--
--/* MMX vectors v2i32, v4i16, v8i8, v2f32 are returned using sret on Darwin
--   32-bit.  Vectors bigger than 128 are returned using sret.  */
--#define LLVM_SHOULD_RETURN_VECTOR_AS_SHADOW(X,isBuiltin)\
--  llvm_x86_should_return_vector_as_shadow((X),(isBuiltin))
--
--extern bool
--llvm_x86_should_not_return_complex_in_memory(tree_node *type);
--
--/* LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY - A hook to allow
--   special _Complex handling. Return true if X should be returned using
--   multiple value return instruction.  */
--#define LLVM_SHOULD_NOT_RETURN_COMPLEX_IN_MEMORY(X) \
--  llvm_x86_should_not_return_complex_in_memory((X))
--
--extern bool
--llvm_x86_should_pass_aggregate_as_fca(tree_node *type, const Type *);
--
--/* LLVM_SHOULD_PASS_AGGREGATE_AS_FCA - Return true if an aggregate of the
--   specified type should be passed as a first-class aggregate. */
--#ifndef LLVM_SHOULD_PASS_AGGREGATE_AS_FCA
--#define LLVM_SHOULD_PASS_AGGREGATE_AS_FCA(X, TY) \
--  llvm_x86_should_pass_aggregate_as_fca(X, TY)
--#endif
--
--extern bool llvm_x86_should_pass_aggregate_in_memory(tree_node *, const Type *);
--
--#define LLVM_SHOULD_PASS_AGGREGATE_USING_BYVAL_ATTR(X, TY)      \
--  llvm_x86_should_pass_aggregate_in_memory(X, TY)
--
--
--extern bool
--llvm_x86_64_should_pass_aggregate_in_mixed_regs(tree_node *, const Type *Ty,
--                                                std::vector<const Type*>&);
--extern bool
--llvm_x86_32_should_pass_aggregate_in_mixed_regs(tree_node *, const Type *Ty,
--                                                std::vector<const Type*>&);
--
--#define LLVM_SHOULD_PASS_AGGREGATE_IN_MIXED_REGS(T, TY, CC, E)       \
--  (TARGET_64BIT ?                                                    \
--   llvm_x86_64_should_pass_aggregate_in_mixed_regs((T), (TY), (E)) : \
--   llvm_x86_32_should_pass_aggregate_in_mixed_regs((T), (TY), (E)))
--
--extern
--bool llvm_x86_64_aggregate_partially_passed_in_regs(std::vector<const Type*>&,
--                                                    std::vector<const Type*>&,
--                                                    bool);
--
--#define LLVM_AGGREGATE_PARTIALLY_PASSED_IN_REGS(E, SE, ISR, CC)       \
--  (TARGET_64BIT ?                                                     \
--   llvm_x86_64_aggregate_partially_passed_in_regs((E), (SE), (ISR)) : \
--   false)
--
--#endif /* DRAGONEGG_ABI_H */
--
--/* Register class used for passing given 64bit part of the argument.
--   These represent classes as documented by the PS ABI, with the exception
--   of SSESF, SSEDF classes, that are basically SSE class, just gcc will
--   use SF or DFmode move instead of DImode to avoid reformatting penalties.
--
--   Similarly we play games with INTEGERSI_CLASS to use cheaper SImode moves
--   whenever possible (upper half does contain padding).
-- */
--enum x86_64_reg_class
--  {
--    X86_64_NO_CLASS,
--    X86_64_INTEGER_CLASS,
--    X86_64_INTEGERSI_CLASS,
--    X86_64_SSE_CLASS,
--    X86_64_SSESF_CLASS,
--    X86_64_SSEDF_CLASS,
--    X86_64_SSEUP_CLASS,
--    X86_64_X87_CLASS,
--    X86_64_X87UP_CLASS,
--    X86_64_COMPLEX_X87_CLASS,
--    X86_64_MEMORY_CLASS
--  };
--
--/* LLVM_TARGET_INTRINSIC_PREFIX - Specify what prefix this target uses for its
-- * intrinsics.
-- */
--#define LLVM_TARGET_INTRINSIC_PREFIX "x86"
--
--/* LLVM_TARGET_NAME - This specifies the name of the target, which correlates to
-- * the llvm::InitializeXXXTarget() function.
-- */
--#define LLVM_TARGET_NAME X86
--
--/* Turn -march=xx into a CPU type.
-- */
--#define LLVM_SET_SUBTARGET_FEATURES(F) \
--  { if (TARGET_MACHO && ! strcmp (ix86_arch_string, "apple")) \
--      F.setCPU(TARGET_64BIT ? "core2" : "yonah");             \
--    else                                                      \
--      F.setCPU(ix86_arch_string);                             \
--                                                              \
--    if (TARGET_64BIT)                                         \
--      F.AddFeature("64bit");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_64BIT)   \
--      F.AddFeature("64bit", false);                           \
--                                                              \
--    if (TARGET_MMX)                                           \
--      F.AddFeature("mmx");                                    \
--    else if (target_flags_explicit & OPTION_MASK_ISA_MMX)     \
--      F.AddFeature("mmx", false);                             \
--                                                              \
--    if (TARGET_3DNOW)                                         \
--      F.AddFeature("3dnow");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_3DNOW)   \
--      F.AddFeature("3dnow", false);                           \
--                                                              \
--    if (TARGET_3DNOW_A)                                       \
--      F.AddFeature("3dnowa");                                 \
--    else if (target_flags_explicit & OPTION_MASK_ISA_3DNOW_A) \
--      F.AddFeature("3dnowa", false);                          \
--                                                              \
--    if (TARGET_SSE)                                           \
--      F.AddFeature("sse");                                    \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE)     \
--      F.AddFeature("sse", false);                             \
--                                                              \
--    if (TARGET_SSE2)                                          \
--      F.AddFeature("sse2");                                   \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE2)    \
--      F.AddFeature("sse2", false);                            \
--                                                              \
--    if (TARGET_SSE3)                                          \
--      F.AddFeature("sse3");                                   \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE3)    \
--      F.AddFeature("sse3", false);                            \
--                                                              \
--    if (TARGET_SSSE3)                                         \
--      F.AddFeature("ssse3");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSSE3)   \
--      F.AddFeature("ssse3", false);                           \
--                                                              \
--    if (TARGET_SSE4_1)                                        \
--      F.AddFeature("sse41");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4_1)  \
--      F.AddFeature("sse41", false);                           \
--                                                              \
--    if (TARGET_SSE4_2)                                        \
--      F.AddFeature("sse42");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4_2)  \
--      F.AddFeature("sse42", false);                           \
--                                                              \
--    if (TARGET_AVX)                                           \
--      F.AddFeature("avx");                                    \
--    else if (target_flags_explicit & OPTION_MASK_ISA_AVX)     \
--      F.AddFeature("avx", false);                             \
--                                                              \
--    if (TARGET_FMA)                                           \
--      F.AddFeature("fma3");                                   \
--    else if (target_flags_explicit & OPTION_MASK_ISA_FMA)     \
--      F.AddFeature("fma3", false);                            \
--                                                              \
--    if (TARGET_SSE4A)                                         \
--      F.AddFeature("sse4a");                                  \
--    else if (target_flags_explicit & OPTION_MASK_ISA_SSE4A)   \
--      F.AddFeature("sse4a", false);                           \
--  }
--
--#define LLVM_SET_IMPLICIT_FLOAT(flag_no_implicit_float)       \
--  if (!TARGET_80387)                                          \
--    flag_no_implicit_float = 1;                               \
--  else                                                        \
--    flag_no_implicit_float = 0;
--
--/* LLVM ABI definition macros. */
--
--/* When -m64 is specified, set the architecture to x86_64-os-blah even if the
-- * compiler was configured for i[3456]86-os-blah.
-- */
--#define LLVM_OVERRIDE_TARGET_ARCH() \
--  (TARGET_64BIT ? "x86_64" : "i386")
--
--/* LLVM_TARGET_INTRINSIC_LOWER - To handle builtins, we want to expand the
-- * invocation into normal LLVM code.  If the target can handle the builtin, this
-- * macro should call the target TreeToLLVM::TargetIntrinsicLower method and
-- *  return true.This macro is invoked from a method in the TreeToLLVM class.
-- */
--#define LLVM_TARGET_INTRINSIC_LOWER(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS) \
--        TargetIntrinsicLower(STMT, FNDECL, DESTLOC, RESULT, DESTTY, OPS);
--
--/* LLVM_GET_REG_NAME - When extracting a register name for a constraint, use
--   the string extracted from the magic symbol built for that register, rather
--   than reg_names.  The latter maps both AH and AL to the same thing, which
--   means we can't distinguish them. */
--#define LLVM_GET_REG_NAME(REG_NAME, REG_NUM) __extension__ \
--  ({ const char *nm = (REG_NAME);                          \
--     if (nm && (*nm == '%' || *nm == '#')) ++nm;           \
--     ((!nm || ISDIGIT (*nm)) ? reg_names[REG_NUM] : nm); })
--
--/* LLVM_CANONICAL_ADDRESS_CONSTRAINTS - Valid x86 memory addresses include
--   symbolic values and immediates.  Canonicalize GCC's "p" constraint for
--   memory addresses to allow both memory and immediate operands. */
--#define LLVM_CANONICAL_ADDRESS_CONSTRAINTS "im"
--
--/* Propagate code model setting to backend */
--#define LLVM_SET_MACHINE_OPTIONS(argvec)                \
--  do {                                                  \
--    switch (ix86_cmodel) {                              \
--    default:                                            \
--      sorry ("code model %<%s%> not supported yet",     \
--             ix86_cmodel_string);                       \
--      break;                                            \
--    case CM_SMALL:                                      \
--    case CM_SMALL_PIC:                                  \
--      argvec.push_back("--code-model=small");           \
--      break;                                            \
--    case CM_KERNEL:                                     \
--      argvec.push_back("--code-model=kernel");          \
--      break;                                            \
--    case CM_MEDIUM:                                     \
--    case CM_MEDIUM_PIC:                                 \
--      argvec.push_back("--code-model=medium");          \
--      break;                                            \
--    case CM_32:                                         \
--      argvec.push_back("--code-model=default");         \
--      break;                                            \
--    }                                                   \
--    if (TARGET_OMIT_LEAF_FRAME_POINTER)                 \
--      argvec.push_back("--disable-non-leaf-fp-elim");   \
--                                                        \
--    if (ix86_force_align_arg_pointer)                   \
--      argvec.push_back("-force-align-stack");           \
--  } while (0)
--
--#endif /* DRAGONEGG_TARGET_H */





More information about the llvm-commits mailing list