From: Chris Lattner Date: Fri, 24 Jul 2009 16:50:24 +0000 (+0000) Subject: split the ELF-specific section flag inference-from-name code out X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=26f704669c3389e3663c2669d2b5b819183db29d;p=platform%2Fupstream%2Fllvm.git split the ELF-specific section flag inference-from-name code out into its own helper function. llvm-svn: 76974 --- diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp index 6790ec9..829bb90 100644 --- a/llvm/lib/Target/TargetAsmInfo.cpp +++ b/llvm/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); }