LCOV - code coverage report
Current view: top level - lib/MC - MCSectionELF.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 87 94 92.6 %
Date: 2017-09-14 15:23:50 Functions: 5 5 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- lib/MC/MCSectionELF.cpp - ELF Code Section Representation ----------===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm/MC/MCSectionELF.h"
      11             : #include "llvm/ADT/Triple.h"
      12             : #include "llvm/BinaryFormat/ELF.h"
      13             : #include "llvm/MC/MCAsmInfo.h"
      14             : #include "llvm/MC/MCExpr.h"
      15             : #include "llvm/Support/ErrorHandling.h"
      16             : #include "llvm/Support/raw_ostream.h"
      17             : #include <cassert>
      18             : 
      19             : using namespace llvm;
      20             : 
      21             : MCSectionELF::~MCSectionELF() = default; // anchor.
      22             : 
      23             : // Decides whether a '.section' directive
      24             : // should be printed before the section name.
      25      113886 : bool MCSectionELF::ShouldOmitSectionDirective(StringRef Name,
      26             :                                               const MCAsmInfo &MAI) const {
      27      113886 :   if (isUnique())
      28             :     return false;
      29             : 
      30      113772 :   return MAI.shouldOmitSectionDirective(Name);
      31             : }
      32             : 
      33       63261 : static void printName(raw_ostream &OS, StringRef Name) {
      34       63261 :   if (Name.find_first_not_of("0123456789_."
      35             :                              "abcdefghijklmnopqrstuvwxyz"
      36             :                              "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == Name.npos) {
      37       50847 :     OS << Name;
      38       50847 :     return;
      39             :   }
      40       12414 :   OS << '"';
      41      211412 :   for (const char *B = Name.begin(), *E = Name.end(); B < E; ++B) {
      42      186584 :     if (*B == '"') // Unquoted "
      43           4 :       OS << "\\\"";
      44      186580 :     else if (*B != '\\') // Neither " or backslash
      45      186579 :       OS << *B;
      46           1 :     else if (B + 1 == E) // Trailing backslash
      47           0 :       OS << "\\\\";
      48             :     else {
      49           2 :       OS << B[0] << B[1]; // Quoted character
      50             :       ++B;
      51             :     }
      52             :   }
      53             :   OS << '"';
      54             : }
      55             : 
      56      113886 : void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
      57             :                                         raw_ostream &OS,
      58             :                                         const MCExpr *Subsection) const {
      59      113886 :   if (ShouldOmitSectionDirective(SectionName, MAI)) {
      60       50867 :     OS << '\t' << getSectionName();
      61       50867 :     if (Subsection) {
      62           0 :       OS << '\t';
      63           0 :       Subsection->print(OS, &MAI);
      64             :     }
      65             :     OS << '\n';
      66             :     return;
      67             :   }
      68             : 
      69       63019 :   OS << "\t.section\t";
      70       63019 :   printName(OS, getSectionName());
      71             : 
      72             :   // Handle the weird solaris syntax if desired.
      73       96609 :   if (MAI.usesSunStyleELFSectionSwitchSyntax() &&
      74       33590 :       !(Flags & ELF::SHF_MERGE)) {
      75       33514 :     if (Flags & ELF::SHF_ALLOC)
      76          34 :       OS << ",#alloc";
      77       33514 :     if (Flags & ELF::SHF_EXECINSTR)
      78           0 :       OS << ",#execinstr";
      79       33514 :     if (Flags & ELF::SHF_WRITE)
      80          26 :       OS << ",#write";
      81       33514 :     if (Flags & ELF::SHF_EXCLUDE)
      82           0 :       OS << ",#exclude";
      83       33514 :     if (Flags & ELF::SHF_TLS)
      84           6 :       OS << ",#tls";
      85             :     OS << '\n';
      86             :     return;
      87             :   }
      88             : 
      89       29505 :   OS << ",\"";
      90       29505 :   if (Flags & ELF::SHF_ALLOC)
      91             :     OS << 'a';
      92       29505 :   if (Flags & ELF::SHF_EXCLUDE)
      93             :     OS << 'e';
      94       29505 :   if (Flags & ELF::SHF_EXECINSTR)
      95             :     OS << 'x';
      96       29505 :   if (Flags & ELF::SHF_GROUP)
      97             :     OS << 'G';
      98       29505 :   if (Flags & ELF::SHF_WRITE)
      99             :     OS << 'w';
     100       29505 :   if (Flags & ELF::SHF_MERGE)
     101             :     OS << 'M';
     102       29505 :   if (Flags & ELF::SHF_STRINGS)
     103             :     OS << 'S';
     104       29505 :   if (Flags & ELF::SHF_TLS)
     105             :     OS << 'T';
     106       29505 :   if (Flags & ELF::SHF_LINK_ORDER)
     107             :     OS << 'o';
     108             : 
     109             :   // If there are target-specific flags, print them.
     110       29505 :   Triple::ArchType Arch = T.getArch();
     111       29505 :   if (Arch == Triple::xcore) {
     112         140 :     if (Flags & ELF::XCORE_SHF_CP_SECTION)
     113             :       OS << 'c';
     114         140 :     if (Flags & ELF::XCORE_SHF_DP_SECTION)
     115             :       OS << 'd';
     116       27890 :   } else if (T.isARM() || T.isThumb()) {
     117        2326 :     if (Flags & ELF::SHF_ARM_PURECODE)
     118             :       OS << 'y';
     119             :   }
     120             : 
     121       29505 :   OS << '"';
     122             : 
     123       29505 :   OS << ',';
     124             : 
     125             :   // If comment string is '@', e.g. as on ARM - use '%' instead
     126       59010 :   if (MAI.getCommentString()[0] == '@')
     127             :     OS << '%';
     128             :   else
     129             :     OS << '@';
     130             : 
     131       29505 :   if (Type == ELF::SHT_INIT_ARRAY)
     132          23 :     OS << "init_array";
     133       29482 :   else if (Type == ELF::SHT_FINI_ARRAY)
     134           3 :     OS << "fini_array";
     135       29479 :   else if (Type == ELF::SHT_PREINIT_ARRAY)
     136           1 :     OS << "preinit_array";
     137       29478 :   else if (Type == ELF::SHT_NOBITS)
     138         154 :     OS << "nobits";
     139       29324 :   else if (Type == ELF::SHT_NOTE)
     140           2 :     OS << "note";
     141       29322 :   else if (Type == ELF::SHT_PROGBITS)
     142       29242 :     OS << "progbits";
     143          80 :   else if (Type == ELF::SHT_X86_64_UNWIND)
     144           5 :     OS << "unwind";
     145          75 :   else if (Type == ELF::SHT_MIPS_DWARF)
     146             :     // Print hex value of the flag while we do not have
     147             :     // any standard symbolic representation of the flag.
     148          73 :     OS << "0x7000001e";
     149           2 :   else if (Type == ELF::SHT_LLVM_ODRTAB)
     150           1 :     OS << "llvm_odrtab";
     151             :   else
     152           6 :     report_fatal_error("unsupported type 0x" + Twine::utohexstr(Type) +
     153           4 :                        " for section " + getSectionName());
     154             : 
     155       29504 :   if (EntrySize) {
     156             :     assert(Flags & ELF::SHF_MERGE);
     157        9487 :     OS << "," << EntrySize;
     158             :   }
     159             : 
     160       29504 :   if (Flags & ELF::SHF_GROUP) {
     161         139 :     OS << ",";
     162         278 :     printName(OS, Group->getName());
     163         139 :     OS << ",comdat";
     164             :   }
     165             : 
     166       29504 :   if (Flags & ELF::SHF_LINK_ORDER) {
     167             :     assert(AssociatedSymbol);
     168         103 :     OS << ",";
     169         206 :     printName(OS, AssociatedSymbol->getName());
     170             :   }
     171             : 
     172       29504 :   if (isUnique())
     173         114 :     OS << ",unique," << UniqueID;
     174             : 
     175       29504 :   OS << '\n';
     176             : 
     177       29504 :   if (Subsection) {
     178           0 :     OS << "\t.subsection\t";
     179           0 :     Subsection->print(OS, &MAI);
     180             :     OS << '\n';
     181             :   }
     182             : }
     183             : 
     184        1329 : bool MCSectionELF::UseCodeAlign() const {
     185        1329 :   return getFlags() & ELF::SHF_EXECINSTR;
     186             : }
     187             : 
     188     1118130 : bool MCSectionELF::isVirtualSection() const {
     189     1118130 :   return getType() == ELF::SHT_NOBITS;
     190             : }

Generated by: LCOV version 1.13