|
@@ -808,15 +808,29 @@ int64_t DataLayout::getIndexedOffsetInType(Type *ElemTy,
|
|
|
/// global. This includes an explicitly requested alignment (if the global
|
|
|
/// has one).
|
|
|
unsigned DataLayout::getPreferredAlignment(const GlobalVariable *GV) const {
|
|
|
+ unsigned GVAlignment = GV->getAlignment();
|
|
|
+ // If a section is specified, always precisely honor explicit alignment,
|
|
|
+ // so we don't insert padding into a section we don't control.
|
|
|
+ if (GVAlignment && GV->hasSection())
|
|
|
+ return GVAlignment;
|
|
|
+
|
|
|
+ // If no explicit alignment is specified, compute the alignment based on
|
|
|
+ // the IR type. If an alignment is specified, increase it to match the ABI
|
|
|
+ // alignment of the IR type.
|
|
|
+ //
|
|
|
+ // FIXME: Not sure it makes sense to use the alignment of the type if
|
|
|
+ // there's already an explicit alignment specification.
|
|
|
Type *ElemType = GV->getValueType();
|
|
|
unsigned Alignment = getPrefTypeAlignment(ElemType);
|
|
|
- unsigned GVAlignment = GV->getAlignment();
|
|
|
if (GVAlignment >= Alignment) {
|
|
|
Alignment = GVAlignment;
|
|
|
} else if (GVAlignment != 0) {
|
|
|
Alignment = std::max(GVAlignment, getABITypeAlignment(ElemType));
|
|
|
}
|
|
|
|
|
|
+ // If no explicit alignment is specified, and the global is large, increase
|
|
|
+ // the alignment to 16.
|
|
|
+ // FIXME: Why 16, specifically?
|
|
|
if (GV->hasInitializer() && GVAlignment == 0) {
|
|
|
if (Alignment < 16) {
|
|
|
// If the global is not external, see if it is large. If so, give it a
|