mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
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:
parent
dd1c20d258
commit
beb9d40900
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user