LCOV - code coverage report
Current view: top level - lib/Target/AVR/MCTargetDesc - AVRELFObjectWriter.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 76 104 73.1 %
Date: 2018-10-20 13:21:21 Functions: 4 5 80.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- AVRELFObjectWriter.cpp - AVR ELF Writer ---------------------------===//
       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 "MCTargetDesc/AVRFixupKinds.h"
      11             : #include "MCTargetDesc/AVRMCTargetDesc.h"
      12             : 
      13             : #include "llvm/MC/MCAssembler.h"
      14             : #include "llvm/MC/MCELFObjectWriter.h"
      15             : #include "llvm/MC/MCExpr.h"
      16             : #include "llvm/MC/MCObjectWriter.h"
      17             : #include "llvm/MC/MCSection.h"
      18             : #include "llvm/MC/MCValue.h"
      19             : #include "llvm/Support/ErrorHandling.h"
      20             : 
      21             : namespace llvm {
      22             : 
      23             : /// Writes AVR machine code into an ELF32 object file.
      24             : class AVRELFObjectWriter : public MCELFObjectTargetWriter {
      25             : public:
      26             :   AVRELFObjectWriter(uint8_t OSABI);
      27             : 
      28         179 :   virtual ~AVRELFObjectWriter() {}
      29             : 
      30             :   unsigned getRelocType(MCContext &Ctx,
      31             :                         const MCValue &Target,
      32             :                         const MCFixup &Fixup,
      33             :                         bool IsPCRel) const override;
      34             : };
      35             : 
      36         179 : AVRELFObjectWriter::AVRELFObjectWriter(uint8_t OSABI)
      37         179 :     : MCELFObjectTargetWriter(false, OSABI, ELF::EM_AVR, true) {}
      38             : 
      39          73 : unsigned AVRELFObjectWriter::getRelocType(MCContext &Ctx,
      40             :                                           const MCValue &Target,
      41             :                                           const MCFixup &Fixup,
      42             :                                           bool IsPCRel) const {
      43          73 :   MCSymbolRefExpr::VariantKind Modifier = Target.getAccessVariant();
      44          73 :   switch ((unsigned) Fixup.getKind()) {
      45           6 :   case FK_Data_1:
      46           6 :     switch (Modifier) {
      47           0 :     default:
      48           0 :       llvm_unreachable("Unsupported Modifier");
      49             :     case MCSymbolRefExpr::VK_None:
      50             :       return ELF::R_AVR_8;
      51           1 :     case MCSymbolRefExpr::VK_AVR_DIFF8:
      52           1 :       return ELF::R_AVR_DIFF8;
      53           1 :     case MCSymbolRefExpr::VK_AVR_LO8:
      54           1 :       return ELF::R_AVR_8_LO8;
      55           1 :     case MCSymbolRefExpr::VK_AVR_HI8:
      56           1 :       return ELF::R_AVR_8_HI8;
      57           1 :     case MCSymbolRefExpr::VK_AVR_HLO8:
      58           1 :       return ELF::R_AVR_8_HLO8;
      59             :     }
      60           2 :   case FK_Data_4:
      61           2 :     switch (Modifier) {
      62           0 :     default:
      63           0 :       llvm_unreachable("Unsupported Modifier");
      64             :     case MCSymbolRefExpr::VK_None:
      65             :       return ELF::R_AVR_32;
      66           1 :     case MCSymbolRefExpr::VK_AVR_DIFF32:
      67           1 :       return ELF::R_AVR_DIFF32;
      68             :     }
      69           5 :   case FK_Data_2:
      70           5 :     switch (Modifier) {
      71           0 :     default:
      72           0 :       llvm_unreachable("Unsupported Modifier");
      73             :     case MCSymbolRefExpr::VK_None:
      74             :       return ELF::R_AVR_16;
      75           2 :     case MCSymbolRefExpr::VK_AVR_NONE:
      76           2 :       return ELF::R_AVR_16_PM;
      77           1 :     case MCSymbolRefExpr::VK_AVR_DIFF16:
      78           1 :       return ELF::R_AVR_DIFF16;
      79             :     }
      80             :   case AVR::fixup_32:
      81             :     return ELF::R_AVR_32;
      82           2 :   case AVR::fixup_7_pcrel:
      83           2 :     return ELF::R_AVR_7_PCREL;
      84           2 :   case AVR::fixup_13_pcrel:
      85           2 :     return ELF::R_AVR_13_PCREL;
      86           2 :   case AVR::fixup_16:
      87           2 :     return ELF::R_AVR_16;
      88           0 :   case AVR::fixup_16_pm:
      89           0 :     return ELF::R_AVR_16_PM;
      90           3 :   case AVR::fixup_lo8_ldi:
      91           3 :     return ELF::R_AVR_LO8_LDI;
      92           3 :   case AVR::fixup_hi8_ldi:
      93           3 :     return ELF::R_AVR_HI8_LDI;
      94           6 :   case AVR::fixup_hh8_ldi:
      95           6 :     return ELF::R_AVR_HH8_LDI;
      96           2 :   case AVR::fixup_lo8_ldi_neg:
      97           2 :     return ELF::R_AVR_LO8_LDI_NEG;
      98           2 :   case AVR::fixup_hi8_ldi_neg:
      99           2 :     return ELF::R_AVR_HI8_LDI_NEG;
     100           4 :   case AVR::fixup_hh8_ldi_neg:
     101           4 :     return ELF::R_AVR_HH8_LDI_NEG;
     102           3 :   case AVR::fixup_lo8_ldi_pm:
     103           3 :     return ELF::R_AVR_LO8_LDI_PM;
     104           3 :   case AVR::fixup_hi8_ldi_pm:
     105           3 :     return ELF::R_AVR_HI8_LDI_PM;
     106           3 :   case AVR::fixup_hh8_ldi_pm:
     107           3 :     return ELF::R_AVR_HH8_LDI_PM;
     108           2 :   case AVR::fixup_lo8_ldi_pm_neg:
     109           2 :     return ELF::R_AVR_LO8_LDI_PM_NEG;
     110           2 :   case AVR::fixup_hi8_ldi_pm_neg:
     111           2 :     return ELF::R_AVR_HI8_LDI_PM_NEG;
     112           2 :   case AVR::fixup_hh8_ldi_pm_neg:
     113           2 :     return ELF::R_AVR_HH8_LDI_PM_NEG;
     114           5 :   case AVR::fixup_call:
     115           5 :     return ELF::R_AVR_CALL;
     116           1 :   case AVR::fixup_ldi:
     117           1 :     return ELF::R_AVR_LDI;
     118           0 :   case AVR::fixup_6:
     119           0 :     return ELF::R_AVR_6;
     120           2 :   case AVR::fixup_6_adiw:
     121           2 :     return ELF::R_AVR_6_ADIW;
     122           3 :   case AVR::fixup_ms8_ldi:
     123           3 :     return ELF::R_AVR_MS8_LDI;
     124           2 :   case AVR::fixup_ms8_ldi_neg:
     125           2 :     return ELF::R_AVR_MS8_LDI_NEG;
     126           1 :   case AVR::fixup_lo8_ldi_gs:
     127           1 :     return ELF::R_AVR_LO8_LDI_GS;
     128           1 :   case AVR::fixup_hi8_ldi_gs:
     129           1 :     return ELF::R_AVR_HI8_LDI_GS;
     130           0 :   case AVR::fixup_8:
     131           0 :     return ELF::R_AVR_8;
     132           0 :   case AVR::fixup_8_lo8:
     133           0 :     return ELF::R_AVR_8_LO8;
     134           0 :   case AVR::fixup_8_hi8:
     135           0 :     return ELF::R_AVR_8_HI8;
     136           0 :   case AVR::fixup_8_hlo8:
     137           0 :     return ELF::R_AVR_8_HLO8;
     138           0 :   case AVR::fixup_diff8:
     139           0 :     return ELF::R_AVR_DIFF8;
     140           0 :   case AVR::fixup_diff16:
     141           0 :     return ELF::R_AVR_DIFF16;
     142           0 :   case AVR::fixup_diff32:
     143           0 :     return ELF::R_AVR_DIFF32;
     144           0 :   case AVR::fixup_lds_sts_16:
     145           0 :     return ELF::R_AVR_LDS_STS_16;
     146           2 :   case AVR::fixup_port6:
     147           2 :     return ELF::R_AVR_PORT6;
     148           2 :   case AVR::fixup_port5:
     149           2 :     return ELF::R_AVR_PORT5;
     150           0 :   default:
     151           0 :     llvm_unreachable("invalid fixup kind!");
     152             :   }
     153             : }
     154             : 
     155         179 : std::unique_ptr<MCObjectTargetWriter> createAVRELFObjectWriter(uint8_t OSABI) {
     156         179 :   return make_unique<AVRELFObjectWriter>(OSABI);
     157             : }
     158             : 
     159             : } // end of namespace llvm
     160             : 

Generated by: LCOV version 1.13