From beb9d409006abd85ab7a9c1632fdb1d6ad9e6cdd Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Wed, 9 Jul 2008 13:16:59 +0000 Subject: [PATCH] Add code for default section falgs computation git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53290 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetAsmInfo.h | 27 +++++++++++++ lib/Target/TargetAsmInfo.cpp | 63 +++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index bf4fd103383..65c0df49812 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -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 { diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 2adad3d7baa..cda939c87cf 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -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; +}