mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Object: Add SF_Executable symbol flag.
This allows us to remove a few uses of IRObjectFile::getSymbolGV() in llvm-nm. While here change host-dependent logic in llvm-nm to target-dependent logic. Differential Revision: https://reviews.llvm.org/D27075 llvm-svn: 288320
This commit is contained in:
parent
cfd25fdfa1
commit
7f3cfca4ed
@ -88,7 +88,6 @@ class BasicSymbolRef {
|
|||||||
const SymbolicFile *OwningObject;
|
const SymbolicFile *OwningObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// FIXME: should we add a SF_Text?
|
|
||||||
enum Flags : unsigned {
|
enum Flags : unsigned {
|
||||||
SF_None = 0,
|
SF_None = 0,
|
||||||
SF_Undefined = 1U << 0, // Symbol is defined in another object file
|
SF_Undefined = 1U << 0, // Symbol is defined in another object file
|
||||||
@ -103,6 +102,8 @@ public:
|
|||||||
SF_Thumb = 1U << 8, // Thumb symbol in a 32-bit ARM binary
|
SF_Thumb = 1U << 8, // Thumb symbol in a 32-bit ARM binary
|
||||||
SF_Hidden = 1U << 9, // Symbol has hidden visibility
|
SF_Hidden = 1U << 9, // Symbol has hidden visibility
|
||||||
SF_Const = 1U << 10, // Symbol value is constant
|
SF_Const = 1U << 10, // Symbol value is constant
|
||||||
|
SF_Executable = 1U << 11, // Symbol points to an executable section
|
||||||
|
// (IR only)
|
||||||
};
|
};
|
||||||
|
|
||||||
BasicSymbolRef() : OwningObject(nullptr) { }
|
BasicSymbolRef() : OwningObject(nullptr) { }
|
||||||
|
@ -109,7 +109,8 @@ void ModuleSymbolTable::CollectAsmSymbols(
|
|||||||
for (auto &KV : Streamer) {
|
for (auto &KV : Streamer) {
|
||||||
StringRef Key = KV.first();
|
StringRef Key = KV.first();
|
||||||
RecordStreamer::State Value = KV.second;
|
RecordStreamer::State Value = KV.second;
|
||||||
uint32_t Res = BasicSymbolRef::SF_None;
|
// FIXME: For now we just assume that all asm symbols are executable.
|
||||||
|
uint32_t Res = BasicSymbolRef::SF_Executable;
|
||||||
switch (Value) {
|
switch (Value) {
|
||||||
case RecordStreamer::NeverSeen:
|
case RecordStreamer::NeverSeen:
|
||||||
llvm_unreachable("NeverSeen should have been replaced earlier");
|
llvm_unreachable("NeverSeen should have been replaced earlier");
|
||||||
@ -163,6 +164,8 @@ uint32_t ModuleSymbolTable::getSymbolFlags(Symbol S) const {
|
|||||||
if (GVar->isConstant())
|
if (GVar->isConstant())
|
||||||
Res |= BasicSymbolRef::SF_Const;
|
Res |= BasicSymbolRef::SF_Const;
|
||||||
}
|
}
|
||||||
|
if (dyn_cast_or_null<Function>(GV->getBaseObject()))
|
||||||
|
Res |= BasicSymbolRef::SF_Executable;
|
||||||
if (GV->hasPrivateLinkage())
|
if (GV->hasPrivateLinkage())
|
||||||
Res |= BasicSymbolRef::SF_FormatSpecific;
|
Res |= BasicSymbolRef::SF_FormatSpecific;
|
||||||
if (!GV->hasLocalLinkage())
|
if (!GV->hasLocalLinkage())
|
||||||
|
@ -313,10 +313,10 @@ static void darwinPrintSymbol(SymbolicFile &Obj, SymbolListT::iterator I,
|
|||||||
NType |= MachO::N_SECT;
|
NType |= MachO::N_SECT;
|
||||||
if (SymFlags & SymbolRef::SF_Const)
|
if (SymFlags & SymbolRef::SF_Const)
|
||||||
NSect = 3;
|
NSect = 3;
|
||||||
else {
|
else if (SymFlags & SymbolRef::SF_Executable)
|
||||||
IRObjectFile *IRobj = dyn_cast<IRObjectFile>(&Obj);
|
NSect = 1;
|
||||||
NSect = (getSymbolNMTypeChar(*IRobj, I->Sym) == 't') ? 1 : 2;
|
else
|
||||||
}
|
NSect = 2;
|
||||||
}
|
}
|
||||||
if (SymFlags & SymbolRef::SF_Weak)
|
if (SymFlags & SymbolRef::SF_Weak)
|
||||||
NDesc |= MachO::N_WEAK_DEF;
|
NDesc |= MachO::N_WEAK_DEF;
|
||||||
@ -882,15 +882,17 @@ static char getSymbolNMTypeChar(MachOObjectFile &Obj, basic_symbol_iterator I) {
|
|||||||
return '?';
|
return '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
static char getSymbolNMTypeChar(const GlobalValue &GV) {
|
static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) {
|
||||||
|
uint32_t Flags = I->getFlags();
|
||||||
// FIXME: should we print 'b'? At the IR level we cannot be sure if this
|
// FIXME: should we print 'b'? At the IR level we cannot be sure if this
|
||||||
// will be in bss or not, but we could approximate.
|
// will be in bss or not, but we could approximate.
|
||||||
return GV.getValueType()->isFunctionTy() ? 't' : 'd';
|
if (Flags & SymbolRef::SF_Executable)
|
||||||
}
|
return 't';
|
||||||
|
else if (Triple(Obj.getTargetTriple()).isOSDarwin() &&
|
||||||
static char getSymbolNMTypeChar(IRObjectFile &Obj, basic_symbol_iterator I) {
|
(Flags & SymbolRef::SF_Const))
|
||||||
const GlobalValue *GV = Obj.getSymbolGV(I->getRawDataRefImpl());
|
return 's';
|
||||||
return !GV ? 't' : getSymbolNMTypeChar(*GV);
|
else
|
||||||
|
return 'd';
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isObject(SymbolicFile &Obj, basic_symbol_iterator I) {
|
static bool isObject(SymbolicFile &Obj, basic_symbol_iterator I) {
|
||||||
@ -915,12 +917,8 @@ static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) {
|
|||||||
char Ret = '?';
|
char Ret = '?';
|
||||||
if (Symflags & object::SymbolRef::SF_Absolute)
|
if (Symflags & object::SymbolRef::SF_Absolute)
|
||||||
Ret = 'a';
|
Ret = 'a';
|
||||||
else if (IRObjectFile *IR = dyn_cast<IRObjectFile>(&Obj)) {
|
else if (IRObjectFile *IR = dyn_cast<IRObjectFile>(&Obj))
|
||||||
Ret = getSymbolNMTypeChar(*IR, I);
|
Ret = getSymbolNMTypeChar(*IR, I);
|
||||||
Triple Host(sys::getDefaultTargetTriple());
|
|
||||||
if (Ret == 'd' && Host.isOSDarwin() && Symflags & SymbolRef::SF_Const)
|
|
||||||
Ret = 's';
|
|
||||||
}
|
|
||||||
else if (COFFObjectFile *COFF = dyn_cast<COFFObjectFile>(&Obj))
|
else if (COFFObjectFile *COFF = dyn_cast<COFFObjectFile>(&Obj))
|
||||||
Ret = getSymbolNMTypeChar(*COFF, I);
|
Ret = getSymbolNMTypeChar(*COFF, I);
|
||||||
else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj))
|
else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(&Obj))
|
||||||
|
Loading…
Reference in New Issue
Block a user