Add code for default section falgs computation

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53290 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2008-07-09 13:16:59 +00:00
parent dd1c20d258
commit beb9d40900
2 changed files with 90 additions and 0 deletions

View File

@ -30,6 +30,7 @@ namespace llvm {
namespace SectionKind {
enum Kind {
Unknown = 0, ///< Custom section
Text, ///< Text section
Data, ///< Data section
BSS, ///< BSS section
@ -41,6 +42,25 @@ namespace llvm {
};
}
namespace SectionFlags {
enum Flags {
None = 0,
Code = 1 << 0, ///< Section contains code
Writeable = 1 << 1, ///< Section is writeable
BSS = 1 << 2, ///< Section contains only zeroes
Mergeable = 1 << 3, ///< Section contains mergeable data
Strings = 1 << 4, ///< Section contains null-terminated strings
TLS = 1 << 5, ///< Section contains thread-local data
Debug = 1 << 6, ///< Section contains debug data
Linkonce = 1 << 7 ///< Section is linkonce
};
}
struct SectionInfo {
SectionKind::Kind kind;
SectionFlags::Flags flags;
};
class TargetMachine;
class CallInst;
class GlobalValue;
@ -444,6 +464,13 @@ namespace llvm {
/// section kind used for global emission.
SectionKind::Kind SectionKindForGlobal(const GlobalValue *GV) const;
/// SectionFlagsForGlobal - This hook allows the target to select proper
/// section flags either for given global or for section.
unsigned
SectionFlagsForGlobal(const GlobalValue *GV = NULL,
const char* name = NULL);
// Accessors.
//
const char *getTextSection() const {

View File

@ -191,3 +191,66 @@ TargetAsmInfo::SectionKindForGlobal(const GlobalValue *GV) const {
// Variable is not constant or thread-local - emit to generic data section.
return (isThreadLocal ? SectionKind::ThreadData : SectionKind::Data);
}
unsigned
TargetAsmInfo::SectionFlagsForGlobal(const GlobalValue *GV,
const char* name) {
unsigned flags = SectionFlags::None;
// Decode flags from global itself.
if (GV) {
SectionKind::Kind kind = SectionKindForGlobal(GV);
switch (kind) {
case SectionKind::Text:
flags |= SectionFlags::Code;
break;
case SectionKind::ThreadData:
flags |= SectionFlags::TLS;
// FALLS THROUGH
case SectionKind::Data:
flags |= SectionFlags::Writeable;
break;
case SectionKind::ThreadBSS:
flags |= SectionFlags::TLS;
// FALLS THROUGH
case SectionKind::BSS:
flags |= SectionFlags::BSS;
break;
case SectionKind::ROData:
// No additional flags here
break;
case SectionKind::RODataMergeStr:
flags |= SectionFlags::Strings;
// FALLS THROUGH
case SectionKind::RODataMergeConst:
flags |= SectionFlags::Mergeable;
break;
default:
assert(0 && "Unexpected section kind!");
}
if (GV->hasLinkOnceLinkage() ||
GV->hasWeakLinkage() ||
GV->hasCommonLinkage())
flags |= SectionFlags::Linkonce;
}
// Add flags from sections, if any.
if (name) {
// Some lame default implementation
if (strcmp(name, ".bss") == 0 ||
strncmp(name, ".bss.", 5) == 0 ||
strncmp(name, ".gnu.linkonce.b.", 16) == 0)
flags |= SectionFlags::BSS;
else if (strcmp(name, ".tdata") == 0 ||
strncmp(name, ".tdata.", 7) == 0 ||
strncmp(name, ".gnu.linkonce.td.", 17) == 0)
flags |= SectionFlags::TLS;
else if (strcmp(name, ".tbss") == 0 ||
strncmp(name, ".tbss.", 6) == 0 ||
strncmp(name, ".gnu.linkonce.tb.", 17) == 0)
flags |= SectionFlags::BSS | SectionFlags::TLS;
}
return flags;
}