@@ -17,6 +17,7 @@ namespace {
1717namespace attr {
1818const std::string llvmAttr = " llvmAttr" ;
1919const std::string llvmFastMathFlag = " llvmFastMathFlag" ;
20+ const std::string optStrat = " optStrat" ;
2021const std::string section = " section" ;
2122const std::string target = " target" ;
2223const std::string weak = " _weak" ;
@@ -147,6 +148,30 @@ void applyAttrLLVMFastMathFlag(StructLiteralExp *sle, IrFunction *irFunc) {
147148 }
148149}
149150
151+ void applyAttrOptStrat (StructLiteralExp *sle, IrFunction *irFunc) {
152+ checkStructElems (sle, {Type::tstring});
153+ llvm::StringRef value = getStringElem (sle, 0 );
154+
155+ if (value == " none" ) {
156+ if (irFunc->decl ->inlining == PINLINEalways) {
157+ sle->error (" cannot combine '@ldc.attributes.%s(\" none\" )' with "
158+ " 'pragma(inline, true)'" ,
159+ sle->sd ->ident ->string );
160+ return ;
161+ }
162+ irFunc->decl ->inlining = PINLINEnever;
163+ irFunc->func ->addFnAttr (llvm::Attribute::OptimizeNone);
164+ } else if (value == " optsize" ) {
165+ irFunc->func ->addFnAttr (llvm::Attribute::OptimizeForSize);
166+ } else if (value == " minsize" ) {
167+ irFunc->func ->addFnAttr (llvm::Attribute::MinSize);
168+ } else {
169+ sle->warning (
170+ " ignoring unrecognized parameter '%s' for '@ldc.attributes.%s'" ,
171+ value.data (), sle->sd ->ident ->string );
172+ }
173+ }
174+
150175void applyAttrSection (StructLiteralExp *sle, llvm::GlobalObject *globj) {
151176 checkStructElems (sle, {Type::tstring});
152177 globj->setSection (getFirstElemString (sle));
@@ -233,6 +258,10 @@ void applyVarDeclUDAs(VarDeclaration *decl, llvm::GlobalVariable *gvar) {
233258 auto name = sle->sd ->ident ->string ;
234259 if (name == attr::section) {
235260 applyAttrSection (sle, gvar);
261+ } else if (name == attr::optStrat) {
262+ sle->error (
263+ " Special attribute 'ldc.attributes.optStrat' is only valid for "
264+ " functions" );
236265 } else if (name == attr::target) {
237266 sle->error (" Special attribute 'ldc.attributes.target' is only valid for "
238267 " functions" );
@@ -265,6 +294,8 @@ void applyFuncDeclUDAs(FuncDeclaration *decl, IrFunction *irFunc) {
265294 applyAttrLLVMAttr (sle, func);
266295 } else if (name == attr::llvmFastMathFlag) {
267296 applyAttrLLVMFastMathFlag (sle, irFunc);
297+ } else if (name == attr::optStrat) {
298+ applyAttrOptStrat (sle, irFunc);
268299 } else if (name == attr::section) {
269300 applyAttrSection (sle, func);
270301 } else if (name == attr::target) {
0 commit comments