mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
ELF symbol table field st_other support,
excluding visibility bits. Generic STO handling at the Target level. The st_other field of the ELF symbol table is one byte in size. The first 2 bytes are used for generic visibility and are currently handled by llvm. The other six bits are processor specific and need to be set at the target level. A couple of notes: The new static methods for accessing and setting the "other" flags in include/llvm/MC/MCELF.h match the style guide and not the other methods in the file. I don't like the inconsistency, but feel I should follow the prescribed lowerUpper() convention. STO_ value definitions are not specified in gnu land as consistently as the STT_ and STB_ fields. Probably because the latter were defined in a standards doc and the former defined partially in code. I have stuck with the full byte definition of the flags. Contributer: Zoran Jovanovic git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175561 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
608e355484
commit
77afbdce53
@ -28,6 +28,8 @@ class MCELF {
|
|||||||
static unsigned GetType(const MCSymbolData &SD);
|
static unsigned GetType(const MCSymbolData &SD);
|
||||||
static void SetVisibility(MCSymbolData &SD, unsigned Visibility);
|
static void SetVisibility(MCSymbolData &SD, unsigned Visibility);
|
||||||
static unsigned GetVisibility(MCSymbolData &SD);
|
static unsigned GetVisibility(MCSymbolData &SD);
|
||||||
|
static void setOther(MCSymbolData &SD, unsigned Other);
|
||||||
|
static unsigned getOther(MCSymbolData &SD);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,8 @@ public:
|
|||||||
virtual void EmitCOFFSymbolType(int Type);
|
virtual void EmitCOFFSymbolType(int Type);
|
||||||
virtual void EndCOFFSymbolDef();
|
virtual void EndCOFFSymbolDef();
|
||||||
|
|
||||||
|
virtual MCSymbolData &getOrCreateSymbolData(MCSymbol *Symbol);
|
||||||
|
|
||||||
virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);
|
virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value);
|
||||||
|
|
||||||
virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
#include "llvm/ADT/ArrayRef.h"
|
#include "llvm/ADT/ArrayRef.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
|
#include "llvm/MC/MCAssembler.h"
|
||||||
#include "llvm/MC/MCDirectives.h"
|
#include "llvm/MC/MCDirectives.h"
|
||||||
#include "llvm/MC/MCDwarf.h"
|
#include "llvm/MC/MCDwarf.h"
|
||||||
#include "llvm/MC/MCWin64EH.h"
|
#include "llvm/MC/MCWin64EH.h"
|
||||||
@ -286,6 +287,9 @@ namespace llvm {
|
|||||||
/// a Thumb mode function (ARM target only).
|
/// a Thumb mode function (ARM target only).
|
||||||
virtual void EmitThumbFunc(MCSymbol *Func) = 0;
|
virtual void EmitThumbFunc(MCSymbol *Func) = 0;
|
||||||
|
|
||||||
|
/// getOrCreateSymbolData - Get symbol data for given symbol.
|
||||||
|
virtual MCSymbolData &getOrCreateSymbolData(MCSymbol *Symbol);
|
||||||
|
|
||||||
/// EmitAssignment - Emit an assignment of @p Value to @p Symbol.
|
/// EmitAssignment - Emit an assignment of @p Value to @p Symbol.
|
||||||
///
|
///
|
||||||
/// This corresponds to an assembler statement such as:
|
/// This corresponds to an assembler statement such as:
|
||||||
|
@ -546,12 +546,17 @@ void ELFObjectWriter::WriteSymbol(MCDataFragment *SymtabF,
|
|||||||
bool IsReserved = Data.isCommon() || Data.getSymbol().isAbsolute() ||
|
bool IsReserved = Data.isCommon() || Data.getSymbol().isAbsolute() ||
|
||||||
Data.getSymbol().isVariable();
|
Data.getSymbol().isVariable();
|
||||||
|
|
||||||
|
// Binding and Type share the same byte as upper and lower nibbles
|
||||||
uint8_t Binding = MCELF::GetBinding(OrigData);
|
uint8_t Binding = MCELF::GetBinding(OrigData);
|
||||||
uint8_t Visibility = MCELF::GetVisibility(OrigData);
|
|
||||||
uint8_t Type = MCELF::GetType(Data);
|
uint8_t Type = MCELF::GetType(Data);
|
||||||
|
|
||||||
uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
|
uint8_t Info = (Binding << ELF_STB_Shift) | (Type << ELF_STT_Shift);
|
||||||
uint8_t Other = Visibility;
|
|
||||||
|
// Other and Visibility share the same byte with Visability using the lower
|
||||||
|
// 2 bits
|
||||||
|
uint8_t Visibility = MCELF::GetVisibility(OrigData);
|
||||||
|
uint8_t Other = MCELF::getOther(OrigData) <<
|
||||||
|
(ELF_Other_Shift - ELF_STV_Shift);
|
||||||
|
Other |= Visibility;
|
||||||
|
|
||||||
uint64_t Value = SymbolValue(Data, Layout);
|
uint64_t Value = SymbolValue(Data, Layout);
|
||||||
uint64_t Size = 0;
|
uint64_t Size = 0;
|
||||||
|
@ -52,6 +52,8 @@ unsigned MCELF::GetType(const MCSymbolData &SD) {
|
|||||||
return Type;
|
return Type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Visibility is stored in the first two bits of st_other
|
||||||
|
// st_other values are stored in the second byte of get/setFlags
|
||||||
void MCELF::SetVisibility(MCSymbolData &SD, unsigned Visibility) {
|
void MCELF::SetVisibility(MCSymbolData &SD, unsigned Visibility) {
|
||||||
assert(Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_INTERNAL ||
|
assert(Visibility == ELF::STV_DEFAULT || Visibility == ELF::STV_INTERNAL ||
|
||||||
Visibility == ELF::STV_HIDDEN || Visibility == ELF::STV_PROTECTED);
|
Visibility == ELF::STV_HIDDEN || Visibility == ELF::STV_PROTECTED);
|
||||||
@ -68,4 +70,17 @@ unsigned MCELF::GetVisibility(MCSymbolData &SD) {
|
|||||||
return Visibility;
|
return Visibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned MCELF::getOther(MCSymbolData &SD) {
|
||||||
|
unsigned Other =
|
||||||
|
(SD.getFlags() & (0x3f << ELF_Other_Shift)) >> ELF_Other_Shift;
|
||||||
|
return Other;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -504,6 +504,10 @@ void MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
|
|||||||
llvm_unreachable("Generic ELF doesn't support this directive");
|
llvm_unreachable("Generic ELF doesn't support this directive");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MCSymbolData &MCELFStreamer::getOrCreateSymbolData(MCSymbol *Symbol) {
|
||||||
|
return getAssembler().getOrCreateSymbolData(*Symbol);
|
||||||
|
}
|
||||||
|
|
||||||
void MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
void MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
||||||
llvm_unreachable("ELF doesn't support this directive");
|
llvm_unreachable("ELF doesn't support this directive");
|
||||||
}
|
}
|
||||||
|
@ -620,3 +620,8 @@ void MCStreamer::Finish() {
|
|||||||
|
|
||||||
FinishImpl();
|
FinishImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MCSymbolData &MCStreamer::getOrCreateSymbolData(MCSymbol *Symbol) {
|
||||||
|
report_fatal_error("Not supported!");
|
||||||
|
return *(static_cast<MCSymbolData*> (NULL));
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user