@@ -1079,44 +1079,8 @@ void GlobalOp::build(Builder *builder, OperationState &result, LLVMType type,
10791079 result.addRegion ();
10801080}
10811081
1082- // Returns the textual representation of the given linkage.
1083- static StringRef linkageToStr (LLVM::Linkage linkage) {
1084- switch (linkage) {
1085- case LLVM::Linkage::Private:
1086- return " private" ;
1087- case LLVM::Linkage::Internal:
1088- return " internal" ;
1089- case LLVM::Linkage::AvailableExternally:
1090- return " available_externally" ;
1091- case LLVM::Linkage::Linkonce:
1092- return " linkonce" ;
1093- case LLVM::Linkage::Weak:
1094- return " weak" ;
1095- case LLVM::Linkage::Common:
1096- return " common" ;
1097- case LLVM::Linkage::Appending:
1098- return " appending" ;
1099- case LLVM::Linkage::ExternWeak:
1100- return " extern_weak" ;
1101- case LLVM::Linkage::LinkonceODR:
1102- return " linkonce_odr" ;
1103- case LLVM::Linkage::WeakODR:
1104- return " weak_odr" ;
1105- case LLVM::Linkage::External:
1106- return " external" ;
1107- }
1108- llvm_unreachable (" unknown linkage type" );
1109- }
1110-
1111- // Prints the keyword for the linkage type using the printer.
1112- static void printLinkage (OpAsmPrinter &p, LLVM::Linkage linkage) {
1113- p << linkageToStr (linkage);
1114- }
1115-
11161082static void printGlobalOp (OpAsmPrinter &p, GlobalOp op) {
1117- p << op.getOperationName () << ' ' ;
1118- printLinkage (p, op.linkage ());
1119- p << ' ' ;
1083+ p << op.getOperationName () << ' ' << stringifyLinkage (op.linkage ()) << ' ' ;
11201084 if (op.constant ())
11211085 p << " constant " ;
11221086 p.printSymbolName (op.sym_name ());
@@ -1150,22 +1114,30 @@ static int parseOptionalKeywordAlternative(OpAsmParser &parser,
11501114 return -1 ;
11511115}
11521116
1153- // Parses one of the linkage keywords and, if succeeded, appends the "linkage"
1154- // integer attribute with the corresponding value to `result`.
1155- //
1156- // linkage ::= `private` | `internal` | `available_externally` | `linkonce`
1157- // | `weak` | `common` | `appending` | `extern_weak`
1158- // | `linkonce_odr` | `weak_odr` | `external
1159- static ParseResult parseOptionalLinkageKeyword (OpAsmParser &parser,
1160- OperationState &result) {
1161- int index = parseOptionalKeywordAlternative (
1162- parser, {" private" , " internal" , " available_externally" , " linkonce" ,
1163- " weak" , " common" , " appending" , " extern_weak" , " linkonce_odr" ,
1164- " weak_odr" , " external" });
1117+ namespace {
1118+ template <typename Ty> struct EnumTraits {};
1119+
1120+ #define REGISTER_ENUM_TYPE (Ty ) \
1121+ template <> struct EnumTraits <Ty> { \
1122+ static StringRef stringify (Ty value) { return stringify##Ty (value); } \
1123+ static unsigned getMaxEnumVal () { return getMaxEnumValFor##Ty (); } \
1124+ }
1125+
1126+ REGISTER_ENUM_TYPE (Linkage);
1127+ } // end namespace
1128+
1129+ template <typename EnumTy>
1130+ static ParseResult parseOptionalLLVMKeyword (OpAsmParser &parser,
1131+ OperationState &result,
1132+ StringRef name) {
1133+ SmallVector<StringRef, 10 > names;
1134+ for (unsigned i = 0 , e = getMaxEnumValForLinkage (); i <= e; ++i)
1135+ names.push_back (EnumTraits<EnumTy>::stringify (static_cast <EnumTy>(i)));
1136+
1137+ int index = parseOptionalKeywordAlternative (parser, names);
11651138 if (index == -1 )
11661139 return failure ();
1167- result.addAttribute (getLinkageAttrName (),
1168- parser.getBuilder ().getI64IntegerAttr (index));
1140+ result.addAttribute (name, parser.getBuilder ().getI64IntegerAttr (index));
11691141 return success ();
11701142}
11711143
@@ -1175,7 +1147,8 @@ static ParseResult parseOptionalLinkageKeyword(OpAsmParser &parser,
11751147// The type can be omitted for string attributes, in which case it will be
11761148// inferred from the value of the string as [strlen(value) x i8].
11771149static ParseResult parseGlobalOp (OpAsmParser &parser, OperationState &result) {
1178- if (failed (parseOptionalLinkageKeyword (parser, result)))
1150+ if (failed (parseOptionalLLVMKeyword<Linkage>(parser, result,
1151+ getLinkageAttrName ())))
11791152 return parser.emitError (parser.getCurrentLocation (), " expected linkage" );
11801153
11811154 if (succeeded (parser.parseOptionalKeyword (" constant" )))
@@ -1398,7 +1371,8 @@ static Type buildLLVMFunctionType(OpAsmParser &parser, llvm::SMLoc loc,
13981371static ParseResult parseLLVMFuncOp (OpAsmParser &parser,
13991372 OperationState &result) {
14001373 // Default to external linkage if no keyword is provided.
1401- if (failed (parseOptionalLinkageKeyword (parser, result)))
1374+ if (failed (parseOptionalLLVMKeyword<Linkage>(parser, result,
1375+ getLinkageAttrName ())))
14021376 result.addAttribute (getLinkageAttrName (),
14031377 parser.getBuilder ().getI64IntegerAttr (
14041378 static_cast <int64_t >(LLVM::Linkage::External)));
@@ -1441,10 +1415,8 @@ static ParseResult parseLLVMFuncOp(OpAsmParser &parser,
14411415// the external linkage since it is the default value.
14421416static void printLLVMFuncOp (OpAsmPrinter &p, LLVMFuncOp op) {
14431417 p << op.getOperationName () << ' ' ;
1444- if (op.linkage () != LLVM::Linkage::External) {
1445- printLinkage (p, op.linkage ());
1446- p << ' ' ;
1447- }
1418+ if (op.linkage () != LLVM::Linkage::External)
1419+ p << stringifyLinkage (op.linkage ()) << ' ' ;
14481420 p.printSymbolName (op.getName ());
14491421
14501422 LLVMType fnType = op.getType ();
@@ -1510,16 +1482,16 @@ unsigned LLVMFuncOp::getNumFuncResults() {
15101482static LogicalResult verify (LLVMFuncOp op) {
15111483 if (op.linkage () == LLVM::Linkage::Common)
15121484 return op.emitOpError ()
1513- << " functions cannot have '" << linkageToStr (LLVM::Linkage::Common)
1514- << " ' linkage" ;
1485+ << " functions cannot have '"
1486+ << stringifyLinkage (LLVM::Linkage::Common) << " ' linkage" ;
15151487
15161488 if (op.isExternal ()) {
15171489 if (op.linkage () != LLVM::Linkage::External &&
15181490 op.linkage () != LLVM::Linkage::ExternWeak)
15191491 return op.emitOpError ()
15201492 << " external functions must have '"
1521- << linkageToStr (LLVM::Linkage::External) << " ' or '"
1522- << linkageToStr (LLVM::Linkage::ExternWeak) << " ' linkage" ;
1493+ << stringifyLinkage (LLVM::Linkage::External) << " ' or '"
1494+ << stringifyLinkage (LLVM::Linkage::ExternWeak) << " ' linkage" ;
15231495 return success ();
15241496 }
15251497
0 commit comments