mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 04:09:45 +00:00
[CodeGen] prevent abnormal on invalid attributes
Currently, when an invalid attribute is encountered on processing a .s file, clang will abort due to llvm_unreachable. Invalid user input should not cause an abnormal termination of the compiler. Change the interface to return a boolean to indicate the failure as a first step towards improving hanlding of malformed user input to clang. Signed-off-by: Saleem Abdulrasool <compnerd@compnerd.org> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188047 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
623f2025a7
commit
1c9cd021c8
@ -57,7 +57,7 @@ public:
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||
unsigned ByteAlignment);
|
||||
|
@ -323,7 +323,7 @@ namespace llvm {
|
||||
virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) = 0;
|
||||
|
||||
/// EmitSymbolAttribute - Add the given @p Attribute to @p Symbol.
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) = 0;
|
||||
|
||||
/// EmitSymbolDesc - Set the @p DescValue for the @p Symbol.
|
||||
|
@ -154,7 +154,7 @@ public:
|
||||
virtual void EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
|
||||
const MCSymbol *Label);
|
||||
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol);
|
||||
@ -436,7 +436,7 @@ void MCAsmStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
|
||||
}
|
||||
|
||||
|
||||
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
bool MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) {
|
||||
switch (Attribute) {
|
||||
case MCSA_Invalid: llvm_unreachable("Invalid symbol attribute");
|
||||
@ -447,11 +447,12 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
case MCSA_ELF_TypeCommon: /// .type _foo, STT_COMMON # aka @common
|
||||
case MCSA_ELF_TypeNoType: /// .type _foo, STT_NOTYPE # aka @notype
|
||||
case MCSA_ELF_TypeGnuUniqueObject: /// .type _foo, @gnu_unique_object
|
||||
assert(MAI->hasDotTypeDotSizeDirective() && "Symbol Attr not supported");
|
||||
if (!MAI->hasDotTypeDotSizeDirective())
|
||||
return false; // Symbol attribute not supported
|
||||
OS << "\t.type\t" << *Symbol << ','
|
||||
<< ((MAI->getCommentString()[0] != '@') ? '@' : '%');
|
||||
switch (Attribute) {
|
||||
default: llvm_unreachable("Unknown ELF .type");
|
||||
default: return false;
|
||||
case MCSA_ELF_TypeFunction: OS << "function"; break;
|
||||
case MCSA_ELF_TypeIndFunction: OS << "gnu_indirect_function"; break;
|
||||
case MCSA_ELF_TypeObject: OS << "object"; break;
|
||||
@ -461,7 +462,7 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
case MCSA_ELF_TypeGnuUniqueObject: OS << "gnu_unique_object"; break;
|
||||
}
|
||||
EmitEOL();
|
||||
return;
|
||||
return true;
|
||||
case MCSA_Global: // .globl/.global
|
||||
OS << MAI->getGlobalDirective();
|
||||
FlagMap[Symbol] |= EHGlobal;
|
||||
@ -491,6 +492,8 @@ void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
|
||||
OS << *Symbol;
|
||||
EmitEOL();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MCAsmStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
||||
|
@ -148,8 +148,8 @@ static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
|
||||
return T2;
|
||||
}
|
||||
|
||||
void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) {
|
||||
bool MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) {
|
||||
// Indirect symbols are handled differently, to match how 'as' handles
|
||||
// them. This makes writing matching .o files easier.
|
||||
if (Attribute == MCSA_IndirectSymbol) {
|
||||
@ -159,7 +159,7 @@ void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
ISD.Symbol = Symbol;
|
||||
ISD.SectionData = getCurrentSectionData();
|
||||
getAssembler().getIndirectSymbols().push_back(ISD);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Adding a symbol attribute always introduces the symbol, note that an
|
||||
@ -182,7 +182,7 @@ void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
case MCSA_WeakDefAutoPrivate:
|
||||
case MCSA_Invalid:
|
||||
case MCSA_IndirectSymbol:
|
||||
llvm_unreachable("Invalid symbol attribute for ELF!");
|
||||
return false;
|
||||
|
||||
case MCSA_NoDeadStrip:
|
||||
case MCSA_ELF_TypeGnuUniqueObject:
|
||||
@ -251,6 +251,8 @@ void MCELFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCELF::SetVisibility(SD, ELF::STV_INTERNAL);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MCELFStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||
|
@ -51,7 +51,7 @@ public:
|
||||
virtual void EmitLinkerOptions(ArrayRef<std::string> Options);
|
||||
virtual void EmitDataRegion(MCDataRegionType Kind);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
|
||||
unsigned ByteAlignment);
|
||||
@ -217,7 +217,7 @@ void MCMachOStreamer::EmitThumbFunc(MCSymbol *Symbol) {
|
||||
SD.setFlags(SD.getFlags() | SF_ThumbFunc);
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
bool MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) {
|
||||
// Indirect symbols are handled differently, to match how 'as' handles
|
||||
// them. This makes writing matching .o files easier.
|
||||
@ -228,7 +228,7 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
ISD.Symbol = Symbol;
|
||||
ISD.SectionData = getCurrentSectionData();
|
||||
getAssembler().getIndirectSymbols().push_back(ISD);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Adding a symbol attribute always introduces the symbol, note that an
|
||||
@ -257,7 +257,7 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
case MCSA_Protected:
|
||||
case MCSA_Weak:
|
||||
case MCSA_Local:
|
||||
llvm_unreachable("Invalid symbol attribute for Mach-O!");
|
||||
return false;
|
||||
|
||||
case MCSA_Global:
|
||||
SD.setExternal(true);
|
||||
@ -309,6 +309,8 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
SD.setFlags(SD.getFlags() | SF_WeakDefinition | SF_WeakReference);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
||||
|
@ -52,7 +52,9 @@ namespace {
|
||||
const MCSymbol *Label,
|
||||
unsigned PointerSize) {}
|
||||
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){}
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){
|
||||
return true;
|
||||
}
|
||||
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
|
||||
|
||||
|
@ -3375,7 +3375,8 @@ bool AsmParser::ParseDirectiveSymbolAttribute(MCSymbolAttr Attr) {
|
||||
if (Sym->isTemporary())
|
||||
return Error(Loc, "non-local symbol required in directive");
|
||||
|
||||
getStreamer().EmitSymbolAttribute(Sym, Attr);
|
||||
if (!getStreamer().EmitSymbolAttribute(Sym, Attr))
|
||||
return Error(Loc, "unable to emit symbol attribute");
|
||||
|
||||
if (getLexer().is(AsmToken::EndOfStatement))
|
||||
break;
|
||||
|
@ -51,8 +51,9 @@ public:
|
||||
virtual void FinishImpl();
|
||||
|
||||
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
|
||||
report_fatal_error("unsupported directive in pure streamer");
|
||||
return false;
|
||||
}
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {
|
||||
report_fatal_error("unsupported directive in pure streamer");
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
virtual void EmitDebugLabel(MCSymbol *Symbol);
|
||||
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
|
||||
virtual void EmitThumbFunc(MCSymbol *Func);
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
|
||||
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
|
||||
virtual void BeginCOFFSymbolDef(MCSymbol const *Symbol);
|
||||
virtual void EmitCOFFSymbolStorageClass(int StorageClass);
|
||||
@ -201,7 +201,7 @@ void WinCOFFStreamer::EmitThumbFunc(MCSymbol *Func) {
|
||||
llvm_unreachable("not implemented");
|
||||
}
|
||||
|
||||
void WinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
bool WinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
MCSymbolAttr Attribute) {
|
||||
assert(Symbol && "Symbol must be non-null!");
|
||||
assert((Symbol->isInSection()
|
||||
@ -221,8 +221,10 @@ void WinCOFFStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
|
||||
break;
|
||||
|
||||
default:
|
||||
llvm_unreachable("unsupported attribute");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void WinCOFFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
|
||||
|
@ -738,9 +738,10 @@ namespace {
|
||||
// FIXME: should we handle aliases?
|
||||
markDefined(*Symbol);
|
||||
}
|
||||
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
|
||||
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) {
|
||||
if (Attribute == MCSA_Global)
|
||||
markGlobal(*Symbol);
|
||||
return true;
|
||||
}
|
||||
virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
|
||||
uint64_t Size , unsigned ByteAlignment) {
|
||||
|
Loading…
Reference in New Issue
Block a user