diff options
author | Chris Lattner <sabre@nondot.org> | 2009-07-24 16:50:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2009-07-24 16:50:24 +0000 |
commit | 27f3065cf36fc93f619f25862288513b13d8bb95 (patch) | |
tree | 0afec6f4adda30e3eb67ab7285cd33630d29f812 | |
parent | 8adc547a91b423472148877ca5a4b5b5a0fd2f64 (diff) |
split the ELF-specific section flag inference-from-name code out
into its own helper function.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76974 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 6790ec9090..829bb902f1 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -189,8 +189,7 @@ static bool isConstantString(const Constant *C) { } static unsigned SectionFlagsForGlobal(const GlobalValue *GV, - SectionKind::Kind Kind, - const char *Name = 0) { + SectionKind::Kind Kind) { unsigned Flags = SectionFlags::None; // Decode flags from global itself. @@ -222,28 +221,28 @@ static unsigned SectionFlagsForGlobal(const GlobalValue *GV, if (GV->isWeakForLinker()) Flags |= SectionFlags::Linkonce; - // Add flags from sections, if any. - if (Name && *Name != '\0') { - Flags |= SectionFlags::Named; - - // Some lame default implementation based on some magic section names. - if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || - strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || - strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || - strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) - Flags |= SectionFlags::BSS; - else if (strcmp(Name, ".tdata") == 0 || - strncmp(Name, ".tdata.", 7) == 0 || - strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || - strncmp(Name, ".llvm.linkonce.td.", 18) == 0) - Flags |= SectionFlags::TLS; - else if (strcmp(Name, ".tbss") == 0 || - strncmp(Name, ".tbss.", 6) == 0 || - strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || - strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) - Flags |= SectionFlags::BSS | SectionFlags::TLS; - } + return Flags; +} +static unsigned GetSectionFlagsForNamedELFSection(const char *Name) { + unsigned Flags = 0; + // Some lame default implementation based on some magic section names. + if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || + strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || + strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || + strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) + Flags |= SectionFlags::BSS; + else if (strcmp(Name, ".tdata") == 0 || + strncmp(Name, ".tdata.", 7) == 0 || + strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || + strncmp(Name, ".llvm.linkonce.td.", 18) == 0) + Flags |= SectionFlags::TLS; + else if (strcmp(Name, ".tbss") == 0 || + strncmp(Name, ".tbss.", 6) == 0 || + strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || + strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) + Flags |= SectionFlags::BSS | SectionFlags::TLS; + return Flags; } @@ -291,8 +290,16 @@ const Section *TargetAsmInfo::SectionForGlobal(const GlobalValue *GV) const { // Select section name if (GV->hasSection()) { // Honour section already set, if any. - unsigned Flags = SectionFlagsForGlobal(GV, SectionKindForGlobal(GV), - GV->getSection().c_str()); + unsigned Flags = SectionFlagsForGlobal(GV, SectionKindForGlobal(GV)); + + // This is an explicitly named section. + Flags |= SectionFlags::Named; + + // If the target has magic semantics for certain section names, make sure to + // pick up the flags. This allows the user to write things with attribute + // section and still get the appropriate section flags printed. + Flags |= GetSectionFlagsForNamedELFSection(GV->getSection().c_str()); + return getNamedSection(GV->getSection().c_str(), Flags); } |