mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-19 01:48:34 +00:00
[mc] Fix ELF st_other flag.
ELF_Other_Weakref and ELF_Other_ThumbFunc seems to be LLVM internal ELF symbol flags. These should not be emitted to object file. This commit defines ELF_STO_Shift for the target-defined flags for st_other, and increase the value of ELF_Other_Shift to 16. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196440 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
faf4d59137
commit
175fe68393
@ -21,10 +21,12 @@
|
||||
|
||||
namespace llvm {
|
||||
enum {
|
||||
ELF_STT_Shift = 0, // Shift value for STT_* flags.
|
||||
ELF_STB_Shift = 4, // Shift value for STB_* flags.
|
||||
ELF_STV_Shift = 8, // Shift value for STV_* flags.
|
||||
ELF_Other_Shift = 10 // Shift value for other flags.
|
||||
ELF_STT_Shift = 0, // Shift value for STT_* flags.
|
||||
ELF_STB_Shift = 4, // Shift value for STB_* flags.
|
||||
ELF_STV_Shift = 8, // Shift value for STV_* flags.
|
||||
ELF_STO_Shift = 10, // Shift value for STO_* flags.
|
||||
ELF_Other_Shift = 16 // Shift value for llvm local flags,
|
||||
// not part of the final object file
|
||||
};
|
||||
|
||||
enum ELFSymbolFlags {
|
||||
|
@ -551,8 +551,7 @@ void ELFObjectWriter::WriteSymbol(MCDataFragment *SymtabF,
|
||||
// Other and Visibility share the same byte with Visibility using the lower
|
||||
// 2 bits
|
||||
uint8_t Visibility = MCELF::GetVisibility(OrigData);
|
||||
uint8_t Other = MCELF::getOther(OrigData) <<
|
||||
(ELF_Other_Shift - ELF_STV_Shift);
|
||||
uint8_t Other = MCELF::getOther(OrigData) << (ELF_STO_Shift - ELF_STV_Shift);
|
||||
Other |= Visibility;
|
||||
|
||||
uint64_t Value = SymbolValue(Data, Layout);
|
||||
|
@ -72,13 +72,13 @@ unsigned MCELF::GetVisibility(MCSymbolData &SD) {
|
||||
// Other is stored in the last six bits of st_other
|
||||
// st_other values are stored in the second byte of get/setFlags
|
||||
void MCELF::setOther(MCSymbolData &SD, unsigned Other) {
|
||||
uint32_t OtherFlags = SD.getFlags() & ~(0x3f << ELF_Other_Shift);
|
||||
SD.setFlags(OtherFlags | (Other << ELF_Other_Shift));
|
||||
uint32_t OtherFlags = SD.getFlags() & ~(0x3f << ELF_STO_Shift);
|
||||
SD.setFlags(OtherFlags | (Other << ELF_STO_Shift));
|
||||
}
|
||||
|
||||
unsigned MCELF::getOther(MCSymbolData &SD) {
|
||||
unsigned Other =
|
||||
(SD.getFlags() & (0x3f << ELF_Other_Shift)) >> ELF_Other_Shift;
|
||||
(SD.getFlags() & (0x3f << ELF_STO_Shift)) >> ELF_STO_Shift;
|
||||
return Other;
|
||||
}
|
||||
|
||||
|
19
test/MC/ELF/thumb-st_other.s
Normal file
19
test/MC/ELF/thumb-st_other.s
Normal file
@ -0,0 +1,19 @@
|
||||
@ Check the value of st_other for thumb function.
|
||||
|
||||
@ ARM does not define any st_other flags for thumb function. The value
|
||||
@ for st_other should always be 0.
|
||||
|
||||
@ RUN: llvm-mc < %s -triple thumbv5-linux-gnueabi -filetype=obj -o - \
|
||||
@ RUN: | llvm-readobj -t | FileCheck %s
|
||||
|
||||
.syntax unified
|
||||
.text
|
||||
.align 2
|
||||
.thumb_func
|
||||
.global main
|
||||
.type main,%function
|
||||
main:
|
||||
bx lr
|
||||
|
||||
@ CHECK: Name: main
|
||||
@ CHECK: Other: 0
|
Loading…
Reference in New Issue
Block a user