• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===- lib/MC/MCELF.cpp - MC ELF ------------------------------------------===//
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  // This file implements ELF object file writer information.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "MCELF.h"
15  #include "llvm/MC/MCAssembler.h"
16  #include "llvm/MC/MCELFSymbolFlags.h"
17  #include "llvm/MC/MCFixupKindInfo.h"
18  #include "llvm/Support/ELF.h"
19  #include "llvm/Target/TargetAsmBackend.h"
20  
21  namespace llvm {
22  
SetBinding(MCSymbolData & SD,unsigned Binding)23  void MCELF::SetBinding(MCSymbolData &SD, unsigned Binding) {
24    assert(Binding == ELF::STB_LOCAL || Binding == ELF::STB_GLOBAL ||
25           Binding == ELF::STB_WEAK);
26    uint32_t OtherFlags = SD.getFlags() & ~(0xf << ELF_STB_Shift);
27    SD.setFlags(OtherFlags | (Binding << ELF_STB_Shift));
28  }
29  
GetBinding(const MCSymbolData & SD)30  unsigned MCELF::GetBinding(const MCSymbolData &SD) {
31    uint32_t Binding = (SD.getFlags() & (0xf << ELF_STB_Shift)) >> ELF_STB_Shift;
32    assert(Binding == ELF::STB_LOCAL || Binding == ELF::STB_GLOBAL ||
33           Binding == ELF::STB_WEAK);
34    return Binding;
35  }
36  
SetType(MCSymbolData & SD,unsigned Type)37  void MCELF::SetType(MCSymbolData &SD, unsigned Type) {
38    assert(Type == ELF::STT_NOTYPE || Type == ELF::STT_OBJECT ||
39           Type == ELF::STT_FUNC || Type == ELF::STT_SECTION ||
40           Type == ELF::STT_FILE || Type == ELF::STT_COMMON ||
41           Type == ELF::STT_TLS);
42  
43    uint32_t OtherFlags = SD.getFlags() & ~(0xf << ELF_STT_Shift);
44    SD.setFlags(OtherFlags | (Type << ELF_STT_Shift));
45  }
46  
GetType(const MCSymbolData & SD)47  unsigned MCELF::GetType(const MCSymbolData &SD) {
48    uint32_t Type = (SD.getFlags() & (0xf << ELF_STT_Shift)) >> ELF_STT_Shift;
49    assert(Type == ELF::STT_NOTYPE || Type == ELF::STT_OBJECT ||
50           Type == ELF::STT_FUNC || Type == ELF::STT_SECTION ||
51           Type == ELF::STT_FILE || Type == ELF::STT_COMMON ||
52           Type == ELF::STT_TLS);
53    return Type;
54  }
55  
SetVisibility(MCSymbolData & SD,unsigned Visibility)56  void MCELF::SetVisibility(MCSymbolData &SD, unsigned Visibility) {
57    assert(Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_INTERNAL ||
58           Visibility == ELF::STV_HIDDEN || Visibility == ELF::STV_PROTECTED);
59  
60    uint32_t OtherFlags = SD.getFlags() & ~(0x3 << ELF_STV_Shift);
61    SD.setFlags(OtherFlags | (Visibility << ELF_STV_Shift));
62  }
63  
GetVisibility(MCSymbolData & SD)64  unsigned MCELF::GetVisibility(MCSymbolData &SD) {
65    unsigned Visibility =
66      (SD.getFlags() & (0x3 << ELF_STV_Shift)) >> ELF_STV_Shift;
67    assert(Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_INTERNAL ||
68           Visibility == ELF::STV_HIDDEN || Visibility == ELF::STV_PROTECTED);
69    return Visibility;
70  }
71  
72  }
73