1 //===--- SemaAttr.cpp - Semantic Analysis for Attributes ------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements semantic analysis for non-trivial attributes and 11 // pragmas. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/Sema/SemaInternal.h" 16 #include "clang/AST/ASTConsumer.h" 17 #include "clang/AST/Attr.h" 18 #include "clang/AST/Expr.h" 19 #include "clang/Basic/TargetInfo.h" 20 #include "clang/Lex/Preprocessor.h" 21 #include "clang/Sema/Lookup.h" 22 using namespace clang; 23 24 //===----------------------------------------------------------------------===// 25 // Pragma 'pack' and 'options align' 26 //===----------------------------------------------------------------------===// 27 28 Sema::PragmaStackSentinelRAII::PragmaStackSentinelRAII(Sema &S, 29 StringRef SlotLabel, 30 bool ShouldAct) 31 : S(S), SlotLabel(SlotLabel), ShouldAct(ShouldAct) { 32 if (ShouldAct) { 33 S.VtorDispStack.SentinelAction(PSK_Push, SlotLabel); 34 S.DataSegStack.SentinelAction(PSK_Push, SlotLabel); 35 S.BSSSegStack.SentinelAction(PSK_Push, SlotLabel); 36 S.ConstSegStack.SentinelAction(PSK_Push, SlotLabel); 37 S.CodeSegStack.SentinelAction(PSK_Push, SlotLabel); 38 } 39 } 40 41 Sema::PragmaStackSentinelRAII::~PragmaStackSentinelRAII() { 42 if (ShouldAct) { 43 S.VtorDispStack.SentinelAction(PSK_Pop, SlotLabel); 44 S.DataSegStack.SentinelAction(PSK_Pop, SlotLabel); 45 S.BSSSegStack.SentinelAction(PSK_Pop, SlotLabel); 46 S.ConstSegStack.SentinelAction(PSK_Pop, SlotLabel); 47 S.CodeSegStack.SentinelAction(PSK_Pop, SlotLabel); 48 } 49 } 50 51 void Sema::AddAlignmentAttributesForRecord(RecordDecl *RD) { 52 // If there is no pack value, we don't need any attributes. 53 if (!PackStack.CurrentValue) 54 return; 55 56 // Otherwise, check to see if we need a max field alignment attribute. 57 if (unsigned Alignment = PackStack.CurrentValue) { 58 if (Alignment == Sema::kMac68kAlignmentSentinel) 59 RD->addAttr(AlignMac68kAttr::CreateImplicit(Context)); 60 else 61 RD->addAttr(MaxFieldAlignmentAttr::CreateImplicit(Context, 62 Alignment * 8)); 63 } 64 } 65 66 void Sema::AddMsStructLayoutForRecord(RecordDecl *RD) { 67 if (MSStructPragmaOn) 68 RD->addAttr(MSStructAttr::CreateImplicit(Context)); 69 70 // FIXME: We should merge AddAlignmentAttributesForRecord with 71 // AddMsStructLayoutForRecord into AddPragmaAttributesForRecord, which takes 72 // all active pragmas and applies them as attributes to class definitions. 73 if (VtorDispStack.CurrentValue != getLangOpts().VtorDispMode) 74 RD->addAttr( 75 MSVtorDispAttr::CreateImplicit(Context, VtorDispStack.CurrentValue)); 76 } 77 78 void Sema::ActOnPragmaOptionsAlign(PragmaOptionsAlignKind Kind, 79 SourceLocation PragmaLoc) { 80 PragmaMsStackAction Action = Sema::PSK_Reset; 81 unsigned Alignment = 0; 82 switch (Kind) { 83 // For all targets we support native and natural are the same. 84 // 85 // FIXME: This is not true on Darwin/PPC. 86 case POAK_Native: 87 case POAK_Power: 88 case POAK_Natural: 89 Action = Sema::PSK_Push_Set; 90 Alignment = 0; 91 break; 92 93 // Note that '#pragma options align=packed' is not equivalent to attribute 94 // packed, it has a different precedence relative to attribute aligned. 95 case POAK_Packed: 96 Action = Sema::PSK_Push_Set; 97 Alignment = 1; 98 break; 99 100 case POAK_Mac68k: 101 // Check if the target supports this. 102 if (!this->Context.getTargetInfo().hasAlignMac68kSupport()) { 103 Diag(PragmaLoc, diag::err_pragma_options_align_mac68k_target_unsupported); 104 return; 105 } 106 Action = Sema::PSK_Push_Set; 107 Alignment = Sema::kMac68kAlignmentSentinel; 108 break; 109 110 case POAK_Reset: 111 // Reset just pops the top of the stack, or resets the current alignment to 112 // default. 113 Action = Sema::PSK_Pop; 114 if (PackStack.Stack.empty()) { 115 if (PackStack.CurrentValue) { 116 Action = Sema::PSK_Reset; 117 } else { 118 Diag(PragmaLoc, diag::warn_pragma_options_align_reset_failed) 119 << "stack empty"; 120 return; 121 } 122 } 123 break; 124 } 125 126 PackStack.Act(PragmaLoc, Action, StringRef(), Alignment); 127 } 128 129 void Sema::ActOnPragmaPack(SourceLocation PragmaLoc, PragmaMsStackAction Action, 130 StringRef SlotLabel, Expr *alignment) { 131 Expr *Alignment = static_cast<Expr *>(alignment); 132 133 // If specified then alignment must be a "small" power of two. 134 unsigned AlignmentVal = 0; 135 if (Alignment) { 136 llvm::APSInt Val; 137 138 // pack(0) is like pack(), which just works out since that is what 139 // we use 0 for in PackAttr. 140 if (Alignment->isTypeDependent() || 141 Alignment->isValueDependent() || 142 !Alignment->isIntegerConstantExpr(Val, Context) || 143 !(Val == 0 || Val.isPowerOf2()) || 144 Val.getZExtValue() > 16) { 145 Diag(PragmaLoc, diag::warn_pragma_pack_invalid_alignment); 146 return; // Ignore 147 } 148 149 AlignmentVal = (unsigned) Val.getZExtValue(); 150 } 151 if (Action == Sema::PSK_Show) { 152 // Show the current alignment, making sure to show the right value 153 // for the default. 154 // FIXME: This should come from the target. 155 AlignmentVal = PackStack.CurrentValue; 156 if (AlignmentVal == 0) 157 AlignmentVal = 8; 158 if (AlignmentVal == Sema::kMac68kAlignmentSentinel) 159 Diag(PragmaLoc, diag::warn_pragma_pack_show) << "mac68k"; 160 else 161 Diag(PragmaLoc, diag::warn_pragma_pack_show) << AlignmentVal; 162 } 163 // MSDN, C/C++ Preprocessor Reference > Pragma Directives > pack: 164 // "#pragma pack(pop, identifier, n) is undefined" 165 if (Action & Sema::PSK_Pop) { 166 if (Alignment && !SlotLabel.empty()) 167 Diag(PragmaLoc, diag::warn_pragma_pack_pop_identifer_and_alignment); 168 if (PackStack.Stack.empty()) 169 Diag(PragmaLoc, diag::warn_pragma_pop_failed) << "pack" << "stack empty"; 170 } 171 172 PackStack.Act(PragmaLoc, Action, SlotLabel, AlignmentVal); 173 } 174 175 void Sema::ActOnPragmaMSStruct(PragmaMSStructKind Kind) { 176 MSStructPragmaOn = (Kind == PMSST_ON); 177 } 178 179 void Sema::ActOnPragmaMSComment(SourceLocation CommentLoc, 180 PragmaMSCommentKind Kind, StringRef Arg) { 181 auto *PCD = PragmaCommentDecl::Create( 182 Context, Context.getTranslationUnitDecl(), CommentLoc, Kind, Arg); 183 Context.getTranslationUnitDecl()->addDecl(PCD); 184 Consumer.HandleTopLevelDecl(DeclGroupRef(PCD)); 185 } 186 187 void Sema::ActOnPragmaDetectMismatch(SourceLocation Loc, StringRef Name, 188 StringRef Value) { 189 auto *PDMD = PragmaDetectMismatchDecl::Create( 190 Context, Context.getTranslationUnitDecl(), Loc, Name, Value); 191 Context.getTranslationUnitDecl()->addDecl(PDMD); 192 Consumer.HandleTopLevelDecl(DeclGroupRef(PDMD)); 193 } 194 195 void Sema::ActOnPragmaMSPointersToMembers( 196 LangOptions::PragmaMSPointersToMembersKind RepresentationMethod, 197 SourceLocation PragmaLoc) { 198 MSPointerToMemberRepresentationMethod = RepresentationMethod; 199 ImplicitMSInheritanceAttrLoc = PragmaLoc; 200 } 201 202 void Sema::ActOnPragmaMSVtorDisp(PragmaMsStackAction Action, 203 SourceLocation PragmaLoc, 204 MSVtorDispAttr::Mode Mode) { 205 if (Action & PSK_Pop && VtorDispStack.Stack.empty()) 206 Diag(PragmaLoc, diag::warn_pragma_pop_failed) << "vtordisp" 207 << "stack empty"; 208 VtorDispStack.Act(PragmaLoc, Action, StringRef(), Mode); 209 } 210 211 template<typename ValueType> 212 void Sema::PragmaStack<ValueType>::Act(SourceLocation PragmaLocation, 213 PragmaMsStackAction Action, 214 llvm::StringRef StackSlotLabel, 215 ValueType Value) { 216 if (Action == PSK_Reset) { 217 CurrentValue = DefaultValue; 218 return; 219 } 220 if (Action & PSK_Push) 221 Stack.push_back(Slot(StackSlotLabel, CurrentValue, CurrentPragmaLocation)); 222 else if (Action & PSK_Pop) { 223 if (!StackSlotLabel.empty()) { 224 // If we've got a label, try to find it and jump there. 225 auto I = llvm::find_if(llvm::reverse(Stack), [&](const Slot &x) { 226 return x.StackSlotLabel == StackSlotLabel; 227 }); 228 // If we found the label so pop from there. 229 if (I != Stack.rend()) { 230 CurrentValue = I->Value; 231 CurrentPragmaLocation = I->PragmaLocation; 232 Stack.erase(std::prev(I.base()), Stack.end()); 233 } 234 } else if (!Stack.empty()) { 235 // We don't have a label, just pop the last entry. 236 CurrentValue = Stack.back().Value; 237 CurrentPragmaLocation = Stack.back().PragmaLocation; 238 Stack.pop_back(); 239 } 240 } 241 if (Action & PSK_Set) { 242 CurrentValue = Value; 243 CurrentPragmaLocation = PragmaLocation; 244 } 245 } 246 247 bool Sema::UnifySection(StringRef SectionName, 248 int SectionFlags, 249 DeclaratorDecl *Decl) { 250 auto Section = Context.SectionInfos.find(SectionName); 251 if (Section == Context.SectionInfos.end()) { 252 Context.SectionInfos[SectionName] = 253 ASTContext::SectionInfo(Decl, SourceLocation(), SectionFlags); 254 return false; 255 } 256 // A pre-declared section takes precedence w/o diagnostic. 257 if (Section->second.SectionFlags == SectionFlags || 258 !(Section->second.SectionFlags & ASTContext::PSF_Implicit)) 259 return false; 260 auto OtherDecl = Section->second.Decl; 261 Diag(Decl->getLocation(), diag::err_section_conflict) 262 << Decl << OtherDecl; 263 Diag(OtherDecl->getLocation(), diag::note_declared_at) 264 << OtherDecl->getName(); 265 if (auto A = Decl->getAttr<SectionAttr>()) 266 if (A->isImplicit()) 267 Diag(A->getLocation(), diag::note_pragma_entered_here); 268 if (auto A = OtherDecl->getAttr<SectionAttr>()) 269 if (A->isImplicit()) 270 Diag(A->getLocation(), diag::note_pragma_entered_here); 271 return true; 272 } 273 274 bool Sema::UnifySection(StringRef SectionName, 275 int SectionFlags, 276 SourceLocation PragmaSectionLocation) { 277 auto Section = Context.SectionInfos.find(SectionName); 278 if (Section != Context.SectionInfos.end()) { 279 if (Section->second.SectionFlags == SectionFlags) 280 return false; 281 if (!(Section->second.SectionFlags & ASTContext::PSF_Implicit)) { 282 Diag(PragmaSectionLocation, diag::err_section_conflict) 283 << "this" << "a prior #pragma section"; 284 Diag(Section->second.PragmaSectionLocation, 285 diag::note_pragma_entered_here); 286 return true; 287 } 288 } 289 Context.SectionInfos[SectionName] = 290 ASTContext::SectionInfo(nullptr, PragmaSectionLocation, SectionFlags); 291 return false; 292 } 293 294 /// \brief Called on well formed \#pragma bss_seg(). 295 void Sema::ActOnPragmaMSSeg(SourceLocation PragmaLocation, 296 PragmaMsStackAction Action, 297 llvm::StringRef StackSlotLabel, 298 StringLiteral *SegmentName, 299 llvm::StringRef PragmaName) { 300 PragmaStack<StringLiteral *> *Stack = 301 llvm::StringSwitch<PragmaStack<StringLiteral *> *>(PragmaName) 302 .Case("data_seg", &DataSegStack) 303 .Case("bss_seg", &BSSSegStack) 304 .Case("const_seg", &ConstSegStack) 305 .Case("code_seg", &CodeSegStack); 306 if (Action & PSK_Pop && Stack->Stack.empty()) 307 Diag(PragmaLocation, diag::warn_pragma_pop_failed) << PragmaName 308 << "stack empty"; 309 if (SegmentName && 310 !checkSectionName(SegmentName->getLocStart(), SegmentName->getString())) 311 return; 312 Stack->Act(PragmaLocation, Action, StackSlotLabel, SegmentName); 313 } 314 315 /// \brief Called on well formed \#pragma bss_seg(). 316 void Sema::ActOnPragmaMSSection(SourceLocation PragmaLocation, 317 int SectionFlags, StringLiteral *SegmentName) { 318 UnifySection(SegmentName->getString(), SectionFlags, PragmaLocation); 319 } 320 321 void Sema::ActOnPragmaMSInitSeg(SourceLocation PragmaLocation, 322 StringLiteral *SegmentName) { 323 // There's no stack to maintain, so we just have a current section. When we 324 // see the default section, reset our current section back to null so we stop 325 // tacking on unnecessary attributes. 326 CurInitSeg = SegmentName->getString() == ".CRT$XCU" ? nullptr : SegmentName; 327 CurInitSegLoc = PragmaLocation; 328 } 329 330 void Sema::ActOnPragmaUnused(const Token &IdTok, Scope *curScope, 331 SourceLocation PragmaLoc) { 332 333 IdentifierInfo *Name = IdTok.getIdentifierInfo(); 334 LookupResult Lookup(*this, Name, IdTok.getLocation(), LookupOrdinaryName); 335 LookupParsedName(Lookup, curScope, nullptr, true); 336 337 if (Lookup.empty()) { 338 Diag(PragmaLoc, diag::warn_pragma_unused_undeclared_var) 339 << Name << SourceRange(IdTok.getLocation()); 340 return; 341 } 342 343 VarDecl *VD = Lookup.getAsSingle<VarDecl>(); 344 if (!VD) { 345 Diag(PragmaLoc, diag::warn_pragma_unused_expected_var_arg) 346 << Name << SourceRange(IdTok.getLocation()); 347 return; 348 } 349 350 // Warn if this was used before being marked unused. 351 if (VD->isUsed()) 352 Diag(PragmaLoc, diag::warn_used_but_marked_unused) << Name; 353 354 VD->addAttr(UnusedAttr::CreateImplicit(Context, UnusedAttr::GNU_unused, 355 IdTok.getLocation())); 356 } 357 358 void Sema::AddCFAuditedAttribute(Decl *D) { 359 SourceLocation Loc = PP.getPragmaARCCFCodeAuditedLoc(); 360 if (!Loc.isValid()) return; 361 362 // Don't add a redundant or conflicting attribute. 363 if (D->hasAttr<CFAuditedTransferAttr>() || 364 D->hasAttr<CFUnknownTransferAttr>()) 365 return; 366 367 D->addAttr(CFAuditedTransferAttr::CreateImplicit(Context, Loc)); 368 } 369 370 void Sema::ActOnPragmaOptimize(bool On, SourceLocation PragmaLoc) { 371 if(On) 372 OptimizeOffPragmaLocation = SourceLocation(); 373 else 374 OptimizeOffPragmaLocation = PragmaLoc; 375 } 376 377 void Sema::AddRangeBasedOptnone(FunctionDecl *FD) { 378 // In the future, check other pragmas if they're implemented (e.g. pragma 379 // optimize 0 will probably map to this functionality too). 380 if(OptimizeOffPragmaLocation.isValid()) 381 AddOptnoneAttributeIfNoConflicts(FD, OptimizeOffPragmaLocation); 382 } 383 384 void Sema::AddOptnoneAttributeIfNoConflicts(FunctionDecl *FD, 385 SourceLocation Loc) { 386 // Don't add a conflicting attribute. No diagnostic is needed. 387 if (FD->hasAttr<MinSizeAttr>() || FD->hasAttr<AlwaysInlineAttr>()) 388 return; 389 390 // Add attributes only if required. Optnone requires noinline as well, but if 391 // either is already present then don't bother adding them. 392 if (!FD->hasAttr<OptimizeNoneAttr>()) 393 FD->addAttr(OptimizeNoneAttr::CreateImplicit(Context, Loc)); 394 if (!FD->hasAttr<NoInlineAttr>()) 395 FD->addAttr(NoInlineAttr::CreateImplicit(Context, Loc)); 396 } 397 398 typedef std::vector<std::pair<unsigned, SourceLocation> > VisStack; 399 enum : unsigned { NoVisibility = ~0U }; 400 401 void Sema::AddPushedVisibilityAttribute(Decl *D) { 402 if (!VisContext) 403 return; 404 405 NamedDecl *ND = dyn_cast<NamedDecl>(D); 406 if (ND && ND->getExplicitVisibility(NamedDecl::VisibilityForValue)) 407 return; 408 409 VisStack *Stack = static_cast<VisStack*>(VisContext); 410 unsigned rawType = Stack->back().first; 411 if (rawType == NoVisibility) return; 412 413 VisibilityAttr::VisibilityType type 414 = (VisibilityAttr::VisibilityType) rawType; 415 SourceLocation loc = Stack->back().second; 416 417 D->addAttr(VisibilityAttr::CreateImplicit(Context, type, loc)); 418 } 419 420 /// FreeVisContext - Deallocate and null out VisContext. 421 void Sema::FreeVisContext() { 422 delete static_cast<VisStack*>(VisContext); 423 VisContext = nullptr; 424 } 425 426 static void PushPragmaVisibility(Sema &S, unsigned type, SourceLocation loc) { 427 // Put visibility on stack. 428 if (!S.VisContext) 429 S.VisContext = new VisStack; 430 431 VisStack *Stack = static_cast<VisStack*>(S.VisContext); 432 Stack->push_back(std::make_pair(type, loc)); 433 } 434 435 void Sema::ActOnPragmaVisibility(const IdentifierInfo* VisType, 436 SourceLocation PragmaLoc) { 437 if (VisType) { 438 // Compute visibility to use. 439 VisibilityAttr::VisibilityType T; 440 if (!VisibilityAttr::ConvertStrToVisibilityType(VisType->getName(), T)) { 441 Diag(PragmaLoc, diag::warn_attribute_unknown_visibility) << VisType; 442 return; 443 } 444 PushPragmaVisibility(*this, T, PragmaLoc); 445 } else { 446 PopPragmaVisibility(false, PragmaLoc); 447 } 448 } 449 450 void Sema::ActOnPragmaFPContract(tok::OnOffSwitch OOS) { 451 switch (OOS) { 452 case tok::OOS_ON: 453 FPFeatures.fp_contract = 1; 454 break; 455 case tok::OOS_OFF: 456 FPFeatures.fp_contract = 0; 457 break; 458 case tok::OOS_DEFAULT: 459 FPFeatures.fp_contract = getLangOpts().DefaultFPContract; 460 break; 461 } 462 } 463 464 void Sema::PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, 465 SourceLocation Loc) { 466 // Visibility calculations will consider the namespace's visibility. 467 // Here we just want to note that we're in a visibility context 468 // which overrides any enclosing #pragma context, but doesn't itself 469 // contribute visibility. 470 PushPragmaVisibility(*this, NoVisibility, Loc); 471 } 472 473 void Sema::PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc) { 474 if (!VisContext) { 475 Diag(EndLoc, diag::err_pragma_pop_visibility_mismatch); 476 return; 477 } 478 479 // Pop visibility from stack 480 VisStack *Stack = static_cast<VisStack*>(VisContext); 481 482 const std::pair<unsigned, SourceLocation> *Back = &Stack->back(); 483 bool StartsWithPragma = Back->first != NoVisibility; 484 if (StartsWithPragma && IsNamespaceEnd) { 485 Diag(Back->second, diag::err_pragma_push_visibility_mismatch); 486 Diag(EndLoc, diag::note_surrounding_namespace_ends_here); 487 488 // For better error recovery, eat all pushes inside the namespace. 489 do { 490 Stack->pop_back(); 491 Back = &Stack->back(); 492 StartsWithPragma = Back->first != NoVisibility; 493 } while (StartsWithPragma); 494 } else if (!StartsWithPragma && !IsNamespaceEnd) { 495 Diag(EndLoc, diag::err_pragma_pop_visibility_mismatch); 496 Diag(Back->second, diag::note_surrounding_namespace_starts_here); 497 return; 498 } 499 500 Stack->pop_back(); 501 // To simplify the implementation, never keep around an empty stack. 502 if (Stack->empty()) 503 FreeVisContext(); 504 } 505