1 //===- lib/MC/MCELF.cpp - MC ELF ------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements ELF object file writer information.
12 //===----------------------------------------------------------------------===//
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"
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
));
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
);
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
);
43 uint32_t OtherFlags
= SD
.getFlags() & ~(0xf << ELF_STT_Shift
);
44 SD
.setFlags(OtherFlags
| (Type
<< ELF_STT_Shift
));
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
);
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
);
60 uint32_t OtherFlags
= SD
.getFlags() & ~(0xf << ELF_STV_Shift
);
61 SD
.setFlags(OtherFlags
| (Visibility
<< ELF_STV_Shift
));
64 unsigned MCELF::GetVisibility(MCSymbolData
&SD
) {
66 (SD
.getFlags() & (0xf << 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
);