mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Treat [1 x i8] zeroinitializer as a C string, placing such stuff into
mergeable string section. I don't see any bad impact of such decision (rather then placing it into mergeable const section, as it was before), but at least Darwin linker won't complain anymore. The problem in LLVM is that we don't have special type for string constants (like gcc does). Even more, we have two separate types: ConstatArray for non-null strings and ConstantAggregateZero for null stuff.... It's a bit weird :) llvm-svn: 63142
This commit is contained in:
parent
953478bd30
commit
7e63f1aae6
@ -115,9 +115,9 @@ const Section*
|
||||
DarwinTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
|
||||
const TargetData *TD = TM.getTargetData();
|
||||
Constant *C = cast<GlobalVariable>(GV)->getInitializer();
|
||||
const Type *Type = cast<ConstantArray>(C)->getType()->getElementType();
|
||||
const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
|
||||
|
||||
unsigned Size = TD->getTypePaddedSize(Type);
|
||||
unsigned Size = TD->getTypePaddedSize(Ty);
|
||||
if (Size) {
|
||||
unsigned Align = TD->getPreferredAlignment(GV);
|
||||
if (Align <= 32)
|
||||
|
@ -126,8 +126,7 @@ const Section*
|
||||
ELFTargetAsmInfo::MergeableStringSection(const GlobalVariable *GV) const {
|
||||
const TargetData *TD = TM.getTargetData();
|
||||
Constant *C = cast<GlobalVariable>(GV)->getInitializer();
|
||||
const ConstantArray *CVA = cast<ConstantArray>(C);
|
||||
const Type *Ty = CVA->getType()->getElementType();
|
||||
const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
|
||||
|
||||
unsigned Size = TD->getTypePaddedSize(Ty);
|
||||
if (Size <= 16) {
|
||||
|
@ -13,6 +13,7 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/GlobalVariable.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Module.h"
|
||||
@ -170,6 +171,25 @@ static bool isSuitableForBSS(const GlobalVariable *GV) {
|
||||
return (C->isNullValue() && !GV->isConstant() && !NoZerosInBSS);
|
||||
}
|
||||
|
||||
static bool isConstantString(const Constant *C) {
|
||||
// First check: is we have constant array of i8 terminated with zero
|
||||
const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
|
||||
// Check, if initializer is a null-terminated string
|
||||
if (CVA && CVA->isCString())
|
||||
return true;
|
||||
|
||||
// Another possibility: [1 x i8] zeroinitializer
|
||||
if (isa<ConstantAggregateZero>(C)) {
|
||||
if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType())) {
|
||||
return (Ty->getElementType() == Type::Int8Ty &&
|
||||
Ty->getNumElements() == 1);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
SectionKind::Kind
|
||||
TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
|
||||
// Early exit - functions should be always in text sections.
|
||||
@ -191,9 +211,8 @@ TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
|
||||
if (C->ContainsRelocations())
|
||||
return SectionKind::ROData;
|
||||
else {
|
||||
const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
|
||||
// Check, if initializer is a null-terminated string
|
||||
if (CVA && CVA->isCString())
|
||||
if (isConstantString(C))
|
||||
return SectionKind::RODataMergeStr;
|
||||
else
|
||||
return SectionKind::RODataMergeConst;
|
||||
|
Loading…
x
Reference in New Issue
Block a user