1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

Refactor duplicated code. NFC.

Linkage is always followed by visibility and dll storage.

llvm-svn: 269286
This commit is contained in:
Rafael Espindola 2016-05-12 12:37:52 +00:00
parent 135b316516
commit f75c98257e
2 changed files with 39 additions and 33 deletions

View File

@ -454,11 +454,8 @@ bool LLParser::ParseUnnamedGlobal() {
unsigned Linkage, Visibility, DLLStorageClass; unsigned Linkage, Visibility, DLLStorageClass;
GlobalVariable::ThreadLocalMode TLM; GlobalVariable::ThreadLocalMode TLM;
bool UnnamedAddr; bool UnnamedAddr;
if (ParseOptionalLinkage(Linkage, HasLinkage) || if (ParseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass) ||
ParseOptionalVisibility(Visibility) || ParseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
ParseOptionalDLLStorageClass(DLLStorageClass) ||
ParseOptionalThreadLocal(TLM) ||
parseOptionalUnnamedAddr(UnnamedAddr))
return true; return true;
if (Lex.getKind() != lltok::kw_alias && Lex.getKind() != lltok::kw_ifunc) if (Lex.getKind() != lltok::kw_alias && Lex.getKind() != lltok::kw_ifunc)
@ -484,11 +481,8 @@ bool LLParser::ParseNamedGlobal() {
GlobalVariable::ThreadLocalMode TLM; GlobalVariable::ThreadLocalMode TLM;
bool UnnamedAddr; bool UnnamedAddr;
if (ParseToken(lltok::equal, "expected '=' in global variable") || if (ParseToken(lltok::equal, "expected '=' in global variable") ||
ParseOptionalLinkage(Linkage, HasLinkage) || ParseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass) ||
ParseOptionalVisibility(Visibility) || ParseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
ParseOptionalDLLStorageClass(DLLStorageClass) ||
ParseOptionalThreadLocal(TLM) ||
parseOptionalUnnamedAddr(UnnamedAddr))
return true; return true;
if (Lex.getKind() != lltok::kw_alias && Lex.getKind() != lltok::kw_ifunc) if (Lex.getKind() != lltok::kw_alias && Lex.getKind() != lltok::kw_ifunc)
@ -1535,10 +1529,14 @@ static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage) {
/// ::= 'common' /// ::= 'common'
/// ::= 'extern_weak' /// ::= 'extern_weak'
/// ::= 'external' /// ::= 'external'
bool LLParser::ParseOptionalLinkage(unsigned &Res, bool &HasLinkage) { bool LLParser::ParseOptionalLinkage(unsigned &Res, bool &HasLinkage,
unsigned &Visibility,
unsigned &DLLStorageClass) {
Res = parseOptionalLinkageAux(Lex.getKind(), HasLinkage); Res = parseOptionalLinkageAux(Lex.getKind(), HasLinkage);
if (HasLinkage) if (HasLinkage)
Lex.Lex(); Lex.Lex();
ParseOptionalVisibility(Visibility);
ParseOptionalDLLStorageClass(DLLStorageClass);
return false; return false;
} }
@ -1548,15 +1546,22 @@ bool LLParser::ParseOptionalLinkage(unsigned &Res, bool &HasLinkage) {
/// ::= 'hidden' /// ::= 'hidden'
/// ::= 'protected' /// ::= 'protected'
/// ///
bool LLParser::ParseOptionalVisibility(unsigned &Res) { void LLParser::ParseOptionalVisibility(unsigned &Res) {
switch (Lex.getKind()) { switch (Lex.getKind()) {
default: Res = GlobalValue::DefaultVisibility; return false; default:
case lltok::kw_default: Res = GlobalValue::DefaultVisibility; break; Res = GlobalValue::DefaultVisibility;
case lltok::kw_hidden: Res = GlobalValue::HiddenVisibility; break; return;
case lltok::kw_protected: Res = GlobalValue::ProtectedVisibility; break; case lltok::kw_default:
Res = GlobalValue::DefaultVisibility;
break;
case lltok::kw_hidden:
Res = GlobalValue::HiddenVisibility;
break;
case lltok::kw_protected:
Res = GlobalValue::ProtectedVisibility;
break;
} }
Lex.Lex(); Lex.Lex();
return false;
} }
/// ParseOptionalDLLStorageClass /// ParseOptionalDLLStorageClass
@ -1564,14 +1569,19 @@ bool LLParser::ParseOptionalVisibility(unsigned &Res) {
/// ::= 'dllimport' /// ::= 'dllimport'
/// ::= 'dllexport' /// ::= 'dllexport'
/// ///
bool LLParser::ParseOptionalDLLStorageClass(unsigned &Res) { void LLParser::ParseOptionalDLLStorageClass(unsigned &Res) {
switch (Lex.getKind()) { switch (Lex.getKind()) {
default: Res = GlobalValue::DefaultStorageClass; return false; default:
case lltok::kw_dllimport: Res = GlobalValue::DLLImportStorageClass; break; Res = GlobalValue::DefaultStorageClass;
case lltok::kw_dllexport: Res = GlobalValue::DLLExportStorageClass; break; return;
case lltok::kw_dllimport:
Res = GlobalValue::DLLImportStorageClass;
break;
case lltok::kw_dllexport:
Res = GlobalValue::DLLExportStorageClass;
break;
} }
Lex.Lex(); Lex.Lex();
return false;
} }
/// ParseOptionalCallingConv /// ParseOptionalCallingConv
@ -4469,13 +4479,11 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) {
unsigned DLLStorageClass; unsigned DLLStorageClass;
AttrBuilder RetAttrs; AttrBuilder RetAttrs;
unsigned CC; unsigned CC;
bool HasLinkage;
Type *RetType = nullptr; Type *RetType = nullptr;
LocTy RetTypeLoc = Lex.getLoc(); LocTy RetTypeLoc = Lex.getLoc();
if (ParseOptionalLinkage(Linkage) || if (ParseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass) ||
ParseOptionalVisibility(Visibility) || ParseOptionalCallingConv(CC) || ParseOptionalReturnAttrs(RetAttrs) ||
ParseOptionalDLLStorageClass(DLLStorageClass) ||
ParseOptionalCallingConv(CC) ||
ParseOptionalReturnAttrs(RetAttrs) ||
ParseType(RetType, RetTypeLoc, true /*void allowed*/)) ParseType(RetType, RetTypeLoc, true /*void allowed*/))
return true; return true;

View File

@ -232,12 +232,10 @@ namespace llvm {
bool ParseOptionalAddrSpace(unsigned &AddrSpace); bool ParseOptionalAddrSpace(unsigned &AddrSpace);
bool ParseOptionalParamAttrs(AttrBuilder &B); bool ParseOptionalParamAttrs(AttrBuilder &B);
bool ParseOptionalReturnAttrs(AttrBuilder &B); bool ParseOptionalReturnAttrs(AttrBuilder &B);
bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage); bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage,
bool ParseOptionalLinkage(unsigned &Linkage) { unsigned &Visibility, unsigned &DLLStorageClass);
bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage); void ParseOptionalVisibility(unsigned &Visibility);
} void ParseOptionalDLLStorageClass(unsigned &DLLStorageClass);
bool ParseOptionalVisibility(unsigned &Visibility);
bool ParseOptionalDLLStorageClass(unsigned &DLLStorageClass);
bool ParseOptionalCallingConv(unsigned &CC); bool ParseOptionalCallingConv(unsigned &CC);
bool ParseOptionalAlignment(unsigned &Alignment); bool ParseOptionalAlignment(unsigned &Alignment);
bool ParseOptionalDerefAttrBytes(lltok::Kind AttrKind, uint64_t &Bytes); bool ParseOptionalDerefAttrBytes(lltok::Kind AttrKind, uint64_t &Bytes);