[llvm-commits] [dragonegg] r134004 - /dragonegg/trunk/src/Convert.cpp
Duncan Sands
baldrick at free.fr
Tue Jun 28 06:37:44 PDT 2011
Author: baldrick
Date: Tue Jun 28 08:37:44 2011
New Revision: 134004
URL: http://llvm.org/viewvc/llvm-project?rev=134004&view=rev
Log:
The definition of TARGET_MEM_REF changed slightly between
gcc-4.5 and gcc-4.6. Get it working with gcc-4.6.
Modified:
dragonegg/trunk/src/Convert.cpp
Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=134004&r1=134003&r2=134004&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Tue Jun 28 08:37:44 2011
@@ -6026,54 +6026,61 @@
LValue TreeToLLVM::EmitLV_TARGET_MEM_REF(tree exp) {
// TODO: Take the address space into account.
- // TODO: Improve the alignment estimate.
- // The address is &symbol + base + index * step + offset.
- struct mem_address addr;
- get_address_description (exp, &addr);
-
- LValue Ref;
+ Value *Addr;
Value *Delta = 0; // Offset from base pointer in units
- if (addr.symbol) {
- Ref = EmitLV(addr.symbol);
- if (addr.base && !integer_zerop (addr.base))
- Delta = EmitRegister(addr.base);
+#if (GCC_MINOR > 5)
+ // Starting with gcc 4.6 the address is base + index * step + index2 + offset.
+ Addr = EmitRegister(TMR_BASE(exp));
+ if (TMR_INDEX2(exp) && !integer_zerop (TMR_INDEX2(exp)))
+ Delta = EmitRegister(TMR_INDEX2(exp));
+#else
+ // In gcc 4.5 the address is &symbol + base + index * step + offset.
+ if (TMR_SYMBOL(exp)) {
+ Addr = EmitLV(TMR_SYMBOL(exp)).Ptr;
+ if (TMR_BASE(exp) && !integer_zerop (TMR_BASE(exp)))
+ Delta = EmitRegister(TMR_BASE(exp));
} else {
- assert(addr.base && "TARGET_MEM_REF has neither base nor symbol!");
- Value *Base = EmitRegister(addr.base);
+ assert(TMR_BASE(exp) && "TARGET_MEM_REF has neither base nor symbol!");
+ Addr = EmitRegister(TMR_BASE(exp));
// The type of BASE is sizetype or a pointer type. Convert sizetype to i8*.
- // TODO: In mainline BASE always has pointer type.
- if (!isa<PointerType>(Base->getType()))
- Base = Builder.CreateIntToPtr(Base, GetUnitPointerType(Context));
- Ref = LValue(Base, 1);
+ if (!isa<PointerType>(Addr->getType()))
+ Addr = Builder.CreateIntToPtr(Addr, GetUnitPointerType(Context));
}
+#endif
- if (addr.index) {
- Value *Index = EmitRegister(addr.index);
- if (addr.step && !integer_onep (addr.step))
- Index = Builder.CreateMul(Index, EmitRegisterConstant(addr.step));
+ if (TMR_INDEX(exp)) {
+ Value *Index = EmitRegister(TMR_INDEX(exp));
+ if (TMR_STEP(exp) && !integer_onep (TMR_STEP(exp)))
+ Index = Builder.CreateMul(Index, EmitRegisterConstant(TMR_STEP(exp)));
Delta = Delta ? Builder.CreateAdd(Delta, Index) : Index;
}
- if (addr.offset && !integer_zerop (addr.offset)) {
- Constant *Offset = EmitRegisterConstant(addr.offset);
- Delta = Delta ? Builder.CreateAdd(Delta, Offset) : Offset;
+ if (TMR_OFFSET(exp) && !integer_zerop (TMR_OFFSET(exp))) {
+ Constant *Off = ConstantInt::get(Context, getIntegerValue(TMR_OFFSET(exp)));
+ Delta = Delta ? Builder.CreateAdd(Delta, Off) : Off;
}
if (Delta) {
// Advance the base pointer by the given number of units.
- Ref.Ptr = Builder.CreateBitCast(Ref.Ptr, GetUnitPointerType(Context));
- Ref.Ptr = POINTER_TYPE_OVERFLOW_UNDEFINED ?
- Builder.CreateInBoundsGEP(Ref.Ptr, Delta)
- : Builder.CreateGEP(Ref.Ptr, Delta);
- Ref.setAlignment(1); // Let the optimizers compute the alignment.
+ Addr = Builder.CreateBitCast(Addr, GetUnitPointerType(Context));
+ Addr = POINTER_TYPE_OVERFLOW_UNDEFINED ?
+ Builder.CreateInBoundsGEP(Addr, Delta)
+ : Builder.CreateGEP(Addr, Delta);
}
// The result can be of a different pointer type even if we didn't advance it.
- Ref.Ptr = Builder.CreateBitCast(Ref.Ptr,
- ConvertType(TREE_TYPE(exp))->getPointerTo());
+ Addr = Builder.CreateBitCast(Addr,
+ ConvertType(TREE_TYPE(exp))->getPointerTo());
+ unsigned Alignment = TYPE_ALIGN(TREE_TYPE (exp));
+#if (GCC_MINOR < 6)
+ Alignment = get_object_alignment(exp, Alignment, BIGGEST_ALIGNMENT);
+#else
+ Alignment = std::max(Alignment, get_object_alignment(exp, BIGGEST_ALIGNMENT));
+#endif
+ bool Volatile = TREE_THIS_VOLATILE(exp);
- return Ref;
+ return LValue(Addr, Alignment / 8, Volatile);
}
Constant *TreeToLLVM::AddressOfLABEL_DECL(tree exp) {
More information about the llvm-commits
mailing list