LLVM: lib/MC/MCParser/DarwinAsmParser.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

30#include

31#include

32#include

33#include <system_error>

34#include

35

36using namespace llvm;

37

38namespace {

39

40

41

43 template<bool (DarwinAsmParser::*HandlerMethod)(StringRef, SMLoc)>

44 void addDirectiveHandler(StringRef Directive) {

46 this, HandleDirective<DarwinAsmParser, HandlerMethod>);

47 getParser().addDirectiveHandler(Directive, Handler);

48 }

49

50 bool parseSectionSwitch(StringRef Segment, StringRef Section,

51 unsigned TAA = 0, unsigned ImplicitAlign = 0,

52 unsigned StubSize = 0);

53

54 SMLoc LastVersionDirective;

55

56public:

57 DarwinAsmParser() = default;

58

59 void Initialize(MCAsmParser &Parser) override {

60

62

63 addDirectiveHandler<&DarwinAsmParser::parseDirectiveAltEntry>(".alt_entry");

64 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDesc>(".desc");

65 addDirectiveHandler<&DarwinAsmParser::parseDirectiveIndirectSymbol>(

66 ".indirect_symbol");

67 addDirectiveHandler<&DarwinAsmParser::parseDirectiveLsym>(".lsym");

68 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSubsectionsViaSymbols>(

69 ".subsections_via_symbols");

70 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(".dump");

71 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDumpOrLoad>(".load");

72 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSection>(".section");

73 addDirectiveHandler<&DarwinAsmParser::parseDirectivePushSection>(

74 ".pushsection");

75 addDirectiveHandler<&DarwinAsmParser::parseDirectivePopSection>(

76 ".popsection");

77 addDirectiveHandler<&DarwinAsmParser::parseDirectivePrevious>(".previous");

78 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogUnique>(

79 ".secure_log_unique");

80 addDirectiveHandler<&DarwinAsmParser::parseDirectiveSecureLogReset>(

81 ".secure_log_reset");

82 addDirectiveHandler<&DarwinAsmParser::parseDirectiveTBSS>(".tbss");

83 addDirectiveHandler<&DarwinAsmParser::parseDirectiveZerofill>(".zerofill");

84

85 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegion>(

86 ".data_region");

87 addDirectiveHandler<&DarwinAsmParser::parseDirectiveDataRegionEnd>(

88 ".end_data_region");

89

90

91 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveBss>(".bss");

92 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConst>(".const");

93 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstData>(

94 ".const_data");

95 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveConstructor>(

96 ".constructor");

97 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveCString>(

98 ".cstring");

99 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveData>(".data");

100 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDestructor>(

101 ".destructor");

102 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveDyld>(".dyld");

103 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit0>(

104 ".fvmlib_init0");

105 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveFVMLibInit1>(

106 ".fvmlib_init1");

107 addDirectiveHandler<

108 &DarwinAsmParser::parseSectionDirectiveLazySymbolPointers>(

109 ".lazy_symbol_pointer");

110 addDirectiveHandler<&DarwinAsmParser::parseDirectiveLinkerOption>(

111 ".linker_option");

112 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral16>(

113 ".literal16");

114 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral4>(

115 ".literal4");

116 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveLiteral8>(

117 ".literal8");

118 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModInitFunc>(

119 ".mod_init_func");

120 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveModTermFunc>(

121 ".mod_term_func");

122 addDirectiveHandler<

123 &DarwinAsmParser::parseSectionDirectiveNonLazySymbolPointers>(

124 ".non_lazy_symbol_pointer");

125 addDirectiveHandler<

126 &DarwinAsmParser::parseSectionDirectiveThreadLocalVariablePointers>(

127 ".thread_local_variable_pointer");

128 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatClsMeth>(

129 ".objc_cat_cls_meth");

130 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCatInstMeth>(

131 ".objc_cat_inst_meth");

132 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCCategory>(

133 ".objc_category");

134 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClass>(

135 ".objc_class");

136 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassNames>(

137 ".objc_class_names");

138 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClassVars>(

139 ".objc_class_vars");

140 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsMeth>(

141 ".objc_cls_meth");

142 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCClsRefs>(

143 ".objc_cls_refs");

144 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCInstMeth>(

145 ".objc_inst_meth");

146 addDirectiveHandler<

147 &DarwinAsmParser::parseSectionDirectiveObjCInstanceVars>(

148 ".objc_instance_vars");

149 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMessageRefs>(

150 ".objc_message_refs");

151 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCMetaClass>(

152 ".objc_meta_class");

153 addDirectiveHandler<

154 &DarwinAsmParser::parseSectionDirectiveObjCMethVarNames>(

155 ".objc_meth_var_names");

156 addDirectiveHandler<

157 &DarwinAsmParser::parseSectionDirectiveObjCMethVarTypes>(

158 ".objc_meth_var_types");

159 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCModuleInfo>(

160 ".objc_module_info");

161 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCProtocol>(

162 ".objc_protocol");

163 addDirectiveHandler<

164 &DarwinAsmParser::parseSectionDirectiveObjCSelectorStrs>(

165 ".objc_selector_strs");

166 addDirectiveHandler<

167 &DarwinAsmParser::parseSectionDirectiveObjCStringObject>(

168 ".objc_string_object");

169 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveObjCSymbols>(

170 ".objc_symbols");

171 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectivePICSymbolStub>(

172 ".picsymbol_stub");

173 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticConst>(

174 ".static_const");

175 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveStaticData>(

176 ".static_data");

177 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveSymbolStub>(

178 ".symbol_stub");

179 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTData>(".tdata");

180 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveText>(".text");

181 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveThreadInitFunc>(

182 ".thread_init_func");

183 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveTLV>(".tlv");

184

185 addDirectiveHandler<&DarwinAsmParser::parseSectionDirectiveIdent>(".ident");

186 addDirectiveHandler<&DarwinAsmParser::parseWatchOSVersionMin>(

187 ".watchos_version_min");

188 addDirectiveHandler<&DarwinAsmParser::parseTvOSVersionMin>(

189 ".tvos_version_min");

190 addDirectiveHandler<&DarwinAsmParser::parseIOSVersionMin>(

191 ".ios_version_min");

192 addDirectiveHandler<&DarwinAsmParser::parseMacOSXVersionMin>(

193 ".macosx_version_min");

194 addDirectiveHandler<&DarwinAsmParser::parseBuildVersion>(".build_version");

195 addDirectiveHandler<&DarwinAsmParser::parseDirectiveCGProfile>(

196 ".cg_profile");

197

198 LastVersionDirective = SMLoc();

199 }

200

201 bool parseDirectiveAltEntry(StringRef, SMLoc);

202 bool parseDirectiveDesc(StringRef, SMLoc);

203 bool parseDirectiveIndirectSymbol(StringRef, SMLoc);

204 bool parseDirectiveDumpOrLoad(StringRef, SMLoc);

205 bool parseDirectiveLsym(StringRef, SMLoc);

206 bool parseDirectiveLinkerOption(StringRef, SMLoc);

207 bool parseDirectiveSection(StringRef, SMLoc);

208 bool parseDirectivePushSection(StringRef, SMLoc);

209 bool parseDirectivePopSection(StringRef, SMLoc);

210 bool parseDirectivePrevious(StringRef, SMLoc);

211 bool parseDirectiveSecureLogReset(StringRef, SMLoc);

212 bool parseDirectiveSecureLogUnique(StringRef, SMLoc);

213 bool parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);

214 bool parseDirectiveTBSS(StringRef, SMLoc);

215 bool parseDirectiveZerofill(StringRef, SMLoc);

216 bool parseDirectiveDataRegion(StringRef, SMLoc);

217 bool parseDirectiveDataRegionEnd(StringRef, SMLoc);

218

219

220 bool parseSectionDirectiveBss(StringRef, SMLoc) {

221 return parseSectionSwitch("__DATA", "__bss");

222 }

223

224 bool parseSectionDirectiveConst(StringRef, SMLoc) {

225 return parseSectionSwitch("__TEXT", "__const");

226 }

227

228 bool parseSectionDirectiveStaticConst(StringRef, SMLoc) {

229 return parseSectionSwitch("__TEXT", "__static_const");

230 }

231

232 bool parseSectionDirectiveCString(StringRef, SMLoc) {

233 return parseSectionSwitch("__TEXT","__cstring",

235 }

236

237 bool parseSectionDirectiveLiteral4(StringRef, SMLoc) {

238 return parseSectionSwitch("__TEXT", "__literal4",

240 }

241

242 bool parseSectionDirectiveLiteral8(StringRef, SMLoc) {

243 return parseSectionSwitch("__TEXT", "__literal8",

245 }

246

247 bool parseSectionDirectiveLiteral16(StringRef, SMLoc) {

248 return parseSectionSwitch("__TEXT","__literal16",

250 }

251

252 bool parseSectionDirectiveConstructor(StringRef, SMLoc) {

253 return parseSectionSwitch("__TEXT","__constructor");

254 }

255

256 bool parseSectionDirectiveDestructor(StringRef, SMLoc) {

257 return parseSectionSwitch("__TEXT","__destructor");

258 }

259

260 bool parseSectionDirectiveFVMLibInit0(StringRef, SMLoc) {

261 return parseSectionSwitch("__TEXT","__fvmlib_init0");

262 }

263

264 bool parseSectionDirectiveFVMLibInit1(StringRef, SMLoc) {

265 return parseSectionSwitch("__TEXT","__fvmlib_init1");

266 }

267

268 bool parseSectionDirectiveSymbolStub(StringRef, SMLoc) {

269 return parseSectionSwitch("__TEXT","__symbol_stub",

272

273 0, 16);

274 }

275

276 bool parseSectionDirectivePICSymbolStub(StringRef, SMLoc) {

277 return parseSectionSwitch("__TEXT","__picsymbol_stub",

280 }

281

282 bool parseSectionDirectiveData(StringRef, SMLoc) {

283 return parseSectionSwitch("__DATA", "__data");

284 }

285

286 bool parseSectionDirectiveStaticData(StringRef, SMLoc) {

287 return parseSectionSwitch("__DATA", "__static_data");

288 }

289

290 bool parseSectionDirectiveNonLazySymbolPointers(StringRef, SMLoc) {

291 return parseSectionSwitch("__DATA", "__nl_symbol_ptr",

293 }

294

295 bool parseSectionDirectiveLazySymbolPointers(StringRef, SMLoc) {

296 return parseSectionSwitch("__DATA", "__la_symbol_ptr",

298 }

299

300 bool parseSectionDirectiveThreadLocalVariablePointers(StringRef, SMLoc) {

301 return parseSectionSwitch("__DATA", "__thread_ptr",

303 }

304

305 bool parseSectionDirectiveDyld(StringRef, SMLoc) {

306 return parseSectionSwitch("__DATA", "__dyld");

307 }

308

309 bool parseSectionDirectiveModInitFunc(StringRef, SMLoc) {

310 return parseSectionSwitch("__DATA", "__mod_init_func",

312 }

313

314 bool parseSectionDirectiveModTermFunc(StringRef, SMLoc) {

315 return parseSectionSwitch("__DATA", "__mod_term_func",

317 }

318

319 bool parseSectionDirectiveConstData(StringRef, SMLoc) {

320 return parseSectionSwitch("__DATA", "__const");

321 }

322

323 bool parseSectionDirectiveObjCClass(StringRef, SMLoc) {

324 return parseSectionSwitch("__OBJC", "__class",

326 }

327

328 bool parseSectionDirectiveObjCMetaClass(StringRef, SMLoc) {

329 return parseSectionSwitch("__OBJC", "__meta_class",

331 }

332

333 bool parseSectionDirectiveObjCCatClsMeth(StringRef, SMLoc) {

334 return parseSectionSwitch("__OBJC", "__cat_cls_meth",

336 }

337

338 bool parseSectionDirectiveObjCCatInstMeth(StringRef, SMLoc) {

339 return parseSectionSwitch("__OBJC", "__cat_inst_meth",

341 }

342

343 bool parseSectionDirectiveObjCProtocol(StringRef, SMLoc) {

344 return parseSectionSwitch("__OBJC", "__protocol",

346 }

347

348 bool parseSectionDirectiveObjCStringObject(StringRef, SMLoc) {

349 return parseSectionSwitch("__OBJC", "__string_object",

351 }

352

353 bool parseSectionDirectiveObjCClsMeth(StringRef, SMLoc) {

354 return parseSectionSwitch("__OBJC", "__cls_meth",

356 }

357

358 bool parseSectionDirectiveObjCInstMeth(StringRef, SMLoc) {

359 return parseSectionSwitch("__OBJC", "__inst_meth",

361 }

362

363 bool parseSectionDirectiveObjCClsRefs(StringRef, SMLoc) {

364 return parseSectionSwitch("__OBJC", "__cls_refs",

367 }

368

369 bool parseSectionDirectiveObjCMessageRefs(StringRef, SMLoc) {

370 return parseSectionSwitch("__OBJC", "__message_refs",

373 }

374

375 bool parseSectionDirectiveObjCSymbols(StringRef, SMLoc) {

376 return parseSectionSwitch("__OBJC", "__symbols",

378 }

379

380 bool parseSectionDirectiveObjCCategory(StringRef, SMLoc) {

381 return parseSectionSwitch("__OBJC", "__category",

383 }

384

385 bool parseSectionDirectiveObjCClassVars(StringRef, SMLoc) {

386 return parseSectionSwitch("__OBJC", "__class_vars",

388 }

389

390 bool parseSectionDirectiveObjCInstanceVars(StringRef, SMLoc) {

391 return parseSectionSwitch("__OBJC", "__instance_vars",

393 }

394

395 bool parseSectionDirectiveObjCModuleInfo(StringRef, SMLoc) {

396 return parseSectionSwitch("__OBJC", "__module_info",

398 }

399

400 bool parseSectionDirectiveObjCClassNames(StringRef, SMLoc) {

401 return parseSectionSwitch("__TEXT", "__cstring",

403 }

404

405 bool parseSectionDirectiveObjCMethVarTypes(StringRef, SMLoc) {

406 return parseSectionSwitch("__TEXT", "__cstring",

408 }

409

410 bool parseSectionDirectiveObjCMethVarNames(StringRef, SMLoc) {

411 return parseSectionSwitch("__TEXT", "__cstring",

413 }

414

415 bool parseSectionDirectiveObjCSelectorStrs(StringRef, SMLoc) {

416 return parseSectionSwitch("__OBJC", "__selector_strs",

418 }

419

420 bool parseSectionDirectiveTData(StringRef, SMLoc) {

421 return parseSectionSwitch("__DATA", "__thread_data",

423 }

424

425 bool parseSectionDirectiveText(StringRef, SMLoc) {

426 return parseSectionSwitch("__TEXT", "__text",

428 }

429

430 bool parseSectionDirectiveTLV(StringRef, SMLoc) {

431 return parseSectionSwitch("__DATA", "__thread_vars",

433 }

434

435 bool parseSectionDirectiveIdent(StringRef, SMLoc) {

436

437 getParser().eatToEndOfStatement();

438 return false;

439 }

440

441 bool parseSectionDirectiveThreadInitFunc(StringRef, SMLoc) {

442 return parseSectionSwitch("__DATA", "__thread_init",

444 }

445

446 bool parseWatchOSVersionMin(StringRef Directive, SMLoc Loc) {

448 }

449 bool parseTvOSVersionMin(StringRef Directive, SMLoc Loc) {

451 }

452 bool parseIOSVersionMin(StringRef Directive, SMLoc Loc) {

454 }

455 bool parseMacOSXVersionMin(StringRef Directive, SMLoc Loc) {

457 }

458

459 bool parseBuildVersion(StringRef Directive, SMLoc Loc);

461 bool parseMajorMinorVersionComponent(unsigned *Major, unsigned *Minor,

462 const char *VersionName);

463 bool parseOptionalTrailingVersionComponent(unsigned *Component,

464 const char *ComponentName);

465 bool parseVersion(unsigned *Major, unsigned *Minor, unsigned *Update);

466 bool parseSDKVersion(VersionTuple &SDKVersion);

467 void checkVersion(StringRef Directive, StringRef Arg, SMLoc Loc,

469 bool parseDirectiveCGProfile(StringRef Directive, SMLoc Loc);

470};

471

472}

473

474bool DarwinAsmParser::parseSectionSwitch(StringRef Segment, StringRef Section,

475 unsigned TAA, unsigned Alignment,

476 unsigned StubSize) {

478 return TokError("unexpected token in section switching directive");

479 Lex();

480

481

483 getStreamer().switchSection(getContext().getMachOSection(

484 Segment, Section, TAA, StubSize,

486

487

488

489

490

491

492

493

494

495 if (Alignment)

496 getStreamer().emitValueToAlignment(Align(Alignment));

497

498 return false;

499}

500

501

502

503bool DarwinAsmParser::parseDirectiveAltEntry(StringRef, SMLoc) {

506 return TokError("expected identifier in directive");

507

509 return TokError(".alt_entry must preceed symbol definition");

510

511 if (!getStreamer().emitSymbolAttribute(Sym, MCSA_AltEntry))

512 return TokError("unable to emit symbol attribute");

513

514 Lex();

515 return false;

516}

517

518

519

520bool DarwinAsmParser::parseDirectiveDesc(StringRef, SMLoc) {

523 return TokError("expected identifier in directive");

524

526 return TokError("unexpected token in '.desc' directive");

527 Lex();

528

529 int64_t DescValue;

530 if (getParser().parseAbsoluteExpression(DescValue))

531 return true;

532

534 return TokError("unexpected token in '.desc' directive");

535

536 Lex();

537

538

539 getStreamer().emitSymbolDesc(Sym, DescValue);

540

541 return false;

542}

543

544

545

546bool DarwinAsmParser::parseDirectiveIndirectSymbol(StringRef, SMLoc Loc) {

547 const MCSectionMachO *Current = static_cast<const MCSectionMachO *>(

548 getStreamer().getCurrentSectionOnly());

554 return Error(Loc, "indirect symbol not in a symbol pointer or stub "

555 "section");

556

559 return TokError("expected identifier in .indirect_symbol directive");

560

561

563 return TokError("non-local symbol required in directive");

564

566 return TokError("unable to emit indirect symbol attribute for: " +

568

570 return TokError("unexpected token in '.indirect_symbol' directive");

571

572 Lex();

573

574 return false;

575}

576

577

578

579bool DarwinAsmParser::parseDirectiveDumpOrLoad(StringRef Directive,

580 SMLoc IDLoc) {

581 bool IsDump = Directive == ".dump";

583 return TokError("expected string in '.dump' or '.load' directive");

584

585 Lex();

586

588 return TokError("unexpected token in '.dump' or '.load' directive");

589

590 Lex();

591

592

593

594 if (IsDump)

595 return Warning(IDLoc, "ignoring directive .dump for now");

596 else

597 return Warning(IDLoc, "ignoring directive .load for now");

598}

599

600

601

602bool DarwinAsmParser::parseDirectiveLinkerOption(StringRef IDVal, SMLoc) {

603 SmallVector<std::string, 4> Args;

604 while (true) {

606 return TokError("expected string in '" + Twine(IDVal) + "' directive");

607

608 std::string Data;

609 if (getParser().parseEscapedString(Data))

610 return true;

611

613

615 break;

616

618 return TokError("unexpected token in '" + Twine(IDVal) + "' directive");

619 Lex();

620 }

621

622 getStreamer().emitLinkerOptions(Args);

623 return false;

624}

625

626

627

628bool DarwinAsmParser::parseDirectiveLsym(StringRef, SMLoc) {

631 return TokError("expected identifier in directive");

632

634 return TokError("unexpected token in '.lsym' directive");

635 Lex();

636

637 const MCExpr *Value;

638 if (getParser().parseExpression(Value))

639 return true;

640

642 return TokError("unexpected token in '.lsym' directive");

643

644 Lex();

645

646

647

648

649 (void) Sym;

650 return TokError("directive '.lsym' is unsupported");

651}

652

653

654

655bool DarwinAsmParser::parseDirectiveSection(StringRef, SMLoc) {

656 SMLoc Loc = getLexer().getLoc();

657

659 if (getParser().parseIdentifier(SectionName))

660 return Error(Loc, "expected identifier after '.section' directive");

661

662

664 return TokError("unexpected token in '.section' directive");

665

666 std::string SectionSpec = std::string(SectionName);

667 SectionSpec += ",";

668

669

670

671 StringRef EOL = getLexer().LexUntilEndOfStatement();

672 SectionSpec.append(EOL.begin(), EOL.end());

673

674 Lex();

676 return TokError("unexpected token in '.section' directive");

677 Lex();

678

679 StringRef Segment, Section;

680 unsigned StubSize;

681 unsigned TAA;

682 bool TAAParsed;

684 SectionSpec, Segment, Section, TAA, TAAParsed, StubSize))

686

687

688 Triple TT = getParser().getContext().getTargetTriple();

690

692 StringRef NonCoalSection = StringSwitch(Section)

693 .Case("__textcoal_nt", "__text")

694 .Case("__const_coal", "__const")

695 .Case("__datacoal_nt", "__data")

696 .Default(Section);

697

698 if (Section != NonCoalSection) {

699 StringRef SectionVal(Loc.getPointer());

700 size_t B = SectionVal.find(',') + 1, E = SectionVal.find(',', B);

703 getParser().Warning(Loc, "section \"" + Section + "\" is deprecated",

704 SMRange(BLoc, ELoc));

705 getParser().Note(Loc, "change section name to \"" + NonCoalSection +

706 "\"", SMRange(BLoc, ELoc));

707 }

708 }

709

710

711 bool isText = Segment == "__TEXT";

712 getStreamer().switchSection(getContext().getMachOSection(

713 Segment, Section, TAA, StubSize,

715 return false;

716}

717

718

719

720bool DarwinAsmParser::parseDirectivePushSection(StringRef S, SMLoc Loc) {

721 getStreamer().pushSection();

722

723 if (parseDirectiveSection(S, Loc)) {

724 getStreamer().popSection();

725 return true;

726 }

727

728 return false;

729}

730

731

732

733bool DarwinAsmParser::parseDirectivePopSection(StringRef, SMLoc) {

734 if (!getStreamer().popSection())

735 return TokError(".popsection without corresponding .pushsection");

736 return false;

737}

738

739

740

741bool DarwinAsmParser::parseDirectivePrevious(StringRef DirName, SMLoc) {

742 MCSectionSubPair PreviousSection = getStreamer().getPreviousSection();

743 if (!PreviousSection.first)

744 return TokError(".previous without corresponding .section");

745 getStreamer().switchSection(PreviousSection.first, PreviousSection.second);

746 return false;

747}

748

749

750

751bool DarwinAsmParser::parseDirectiveSecureLogUnique(StringRef, SMLoc IDLoc) {

752 StringRef LogMessage = getParser().parseStringToEndOfStatement();

754 return TokError("unexpected token in '.secure_log_unique' directive");

755

757 return Error(IDLoc, ".secure_log_unique specified multiple times");

758

759

760 StringRef SecureLogFile = getContext().getSecureLogFile();

761 if (SecureLogFile.empty())

762 return Error(IDLoc, ".secure_log_unique used but AS_SECURE_LOG_FILE "

763 "environment variable unset.");

764

765

766 raw_fd_ostream *OS = getContext().getSecureLog();

767 if (!OS) {

768 std::error_code EC;

769 auto NewOS = std::make_unique<raw_fd_ostream>(

771 if (EC)

772 return Error(IDLoc, Twine("can't open secure log file: ") +

773 SecureLogFile + " (" + EC.message() + ")");

774 OS = NewOS.get();

775 getContext().setSecureLog(std::move(NewOS));

776 }

777

778

779 unsigned CurBuf = getSourceManager().FindBufferContainingLoc(IDLoc);

780 *OS << getSourceManager().getBufferInfo(CurBuf).Buffer->getBufferIdentifier()

781 << ":" << getSourceManager().FindLineNumber(IDLoc, CurBuf) << ":"

782 << LogMessage + "\n";

783

785

786 return false;

787}

788

789

790

791bool DarwinAsmParser::parseDirectiveSecureLogReset(StringRef, SMLoc IDLoc) {

793 return TokError("unexpected token in '.secure_log_reset' directive");

794

795 Lex();

796

797 getContext().setSecureLogUsed(false);

798

799 return false;

800}

801

802

803

804bool DarwinAsmParser::parseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) {

806 return TokError("unexpected token in '.subsections_via_symbols' directive");

807

808 Lex();

809

810 getStreamer().emitSubsectionsViaSymbols();

811

812 return false;

813}

814

815

816

817bool DarwinAsmParser::parseDirectiveTBSS(StringRef, SMLoc) {

818 SMLoc IDLoc = getLexer().getLoc();

821 return TokError("expected identifier in directive");

822

824 return TokError("unexpected token in directive");

825 Lex();

826

827 int64_t Size;

828 SMLoc SizeLoc = getLexer().getLoc();

829 if (getParser().parseAbsoluteExpression(Size))

830 return true;

831

832 int64_t Pow2Alignment = 0;

833 SMLoc Pow2AlignmentLoc;

835 Lex();

836 Pow2AlignmentLoc = getLexer().getLoc();

837 if (getParser().parseAbsoluteExpression(Pow2Alignment))

838 return true;

839 }

840

842 return TokError("unexpected token in '.tbss' directive");

843

844 Lex();

845

846 if (Size < 0)

847 return Error(SizeLoc, "invalid '.tbss' directive size, can't be less than"

848 "zero");

849

850

851 if (Pow2Alignment < 0)

852 return Error(Pow2AlignmentLoc, "invalid '.tbss' alignment, can't be less"

853 "than zero");

854

856 return Error(IDLoc, "invalid symbol redefinition");

857

858 getStreamer().emitTBSSSymbol(

859 getContext().getMachOSection("__DATA", "__thread_bss",

862 Sym, Size, Align(1ULL << Pow2Alignment));

863

864 return false;

865}

866

867

868

869

870bool DarwinAsmParser::parseDirectiveZerofill(StringRef, SMLoc) {

871 StringRef Segment;

872 if (getParser().parseIdentifier(Segment))

873 return TokError("expected segment name after '.zerofill' directive");

874

876 return TokError("unexpected token in directive");

877 Lex();

878

880 SMLoc SectionLoc = getLexer().getLoc();

881 if (getParser().parseIdentifier(Section))

882 return TokError("expected section name after comma in '.zerofill' "

883 "directive");

884

885

886

888

889 getStreamer().emitZerofill(

892 nullptr, 0, Align(1), SectionLoc);

893 return false;

894 }

895

897 return TokError("unexpected token in directive");

898 Lex();

899

900 SMLoc IDLoc = getLexer().getLoc();

903 return TokError("expected identifier in directive");

904

906 return TokError("unexpected token in directive");

907 Lex();

908

909 int64_t Size;

910 SMLoc SizeLoc = getLexer().getLoc();

911 if (getParser().parseAbsoluteExpression(Size))

912 return true;

913

914 int64_t Pow2Alignment = 0;

915 SMLoc Pow2AlignmentLoc;

917 Lex();

918 Pow2AlignmentLoc = getLexer().getLoc();

919 if (getParser().parseAbsoluteExpression(Pow2Alignment))

920 return true;

921 }

922

924 return TokError("unexpected token in '.zerofill' directive");

925

926 Lex();

927

928 if (Size < 0)

929 return Error(SizeLoc, "invalid '.zerofill' directive size, can't be less "

930 "than zero");

931

932

933

934

935 if (Pow2Alignment < 0)

936 return Error(Pow2AlignmentLoc, "invalid '.zerofill' directive alignment, "

937 "can't be less than zero");

938

940 return Error(IDLoc, "invalid symbol redefinition");

941

942

943

944

945 getStreamer().emitZerofill(

948 Sym, Size, Align(1ULL << Pow2Alignment), SectionLoc);

949

950 return false;

951}

952

953

954

955bool DarwinAsmParser::parseDirectiveDataRegion(StringRef, SMLoc) {

957 Lex();

959 return false;

960 }

961 StringRef RegionType;

962 SMLoc Loc = getParser().getTok().getLoc();

963 if (getParser().parseIdentifier(RegionType))

964 return TokError("expected region type after '.data_region' directive");

965 int Kind = StringSwitch(RegionType)

969 .Default(-1);

970 if (Kind == -1)

971 return Error(Loc, "unknown region type in '.data_region' directive");

972 Lex();

973

975 return false;

976}

977

978

979

980bool DarwinAsmParser::parseDirectiveDataRegionEnd(StringRef, SMLoc) {

982 return TokError("unexpected token in '.end_data_region' directive");

983

984 Lex();

986 return false;

987}

988

992

993

994bool DarwinAsmParser::parseMajorMinorVersionComponent(unsigned *Major,

995 unsigned *Minor,

996 const char *VersionName) {

997

999 return TokError(Twine("invalid ") + VersionName +

1000 " major version number, integer expected");

1001 int64_t MajorVal = getLexer().getTok().getIntVal();

1002 if (MajorVal > 65535 || MajorVal <= 0)

1003 return TokError(Twine("invalid ") + VersionName + " major version number");

1004 *Major = (unsigned)MajorVal;

1005 Lex();

1007 return TokError(Twine(VersionName) +

1008 " minor version number required, comma expected");

1009 Lex();

1010

1012 return TokError(Twine("invalid ") + VersionName +

1013 " minor version number, integer expected");

1014 int64_t MinorVal = getLexer().getTok().getIntVal();

1015 if (MinorVal > 255 || MinorVal < 0)

1016 return TokError(Twine("invalid ") + VersionName + " minor version number");

1017 *Minor = MinorVal;

1018 Lex();

1019 return false;

1020}

1021

1022

1023bool DarwinAsmParser::parseOptionalTrailingVersionComponent(

1024 unsigned *Component, const char *ComponentName) {

1026 Lex();

1028 return TokError(Twine("invalid ") + ComponentName +

1029 " version number, integer expected");

1030 int64_t Val = getLexer().getTok().getIntVal();

1031 if (Val > 255 || Val < 0)

1032 return TokError(Twine("invalid ") + ComponentName + " version number");

1034 Lex();

1035 return false;

1036}

1037

1038

1039

1040bool DarwinAsmParser::parseVersion(unsigned *Major, unsigned *Minor,

1041 unsigned *Update) {

1042 if (parseMajorMinorVersionComponent(Major, Minor, "OS"))

1043 return true;

1044

1045

1046 *Update = 0;

1049 return false;

1051 return TokError("invalid OS update specifier, comma expected");

1052 if (parseOptionalTrailingVersionComponent(Update, "OS update"))

1053 return true;

1054 return false;

1055}

1056

1057bool DarwinAsmParser::parseSDKVersion(VersionTuple &SDKVersion) {

1059 Lex();

1060 unsigned Major, Minor;

1061 if (parseMajorMinorVersionComponent(&Major, &Minor, "SDK"))

1062 return true;

1063 SDKVersion = VersionTuple(Major, Minor);

1064

1065

1067 unsigned Subminor;

1068 if (parseOptionalTrailingVersionComponent(&Subminor, "SDK subminor"))

1069 return true;

1070 SDKVersion = VersionTuple(Major, Minor, Subminor);

1071 }

1072 return false;

1073}

1074

1075void DarwinAsmParser::checkVersion(StringRef Directive, StringRef Arg,

1078 if (Target.getOS() != ExpectedOS)

1079 Warning(Loc, Twine(Directive) +

1080 (Arg.empty() ? Twine() : Twine(' ') + Arg) +

1081 " used while targeting " + Target.getOSName());

1082

1083 if (LastVersionDirective.isValid()) {

1084 Warning(Loc, "overriding previous version directive");

1085 Note(LastVersionDirective, "previous definition is here");

1086 }

1087 LastVersionDirective = Loc;

1088}

1089

1091 switch (Type) {

1096 }

1098}

1099

1100

1101

1102

1103

1104

1105bool DarwinAsmParser::parseVersionMin(StringRef Directive, SMLoc Loc,

1107 unsigned Major;

1108 unsigned Minor;

1109 unsigned Update;

1111 return true;

1112

1113 VersionTuple SDKVersion;

1114 if (isSDKVersionToken(getLexer().getTok()) && parseSDKVersion(SDKVersion))

1115 return true;

1116

1117 if (parseEOL())

1118 return addErrorSuffix(Twine(" in '") + Directive + "' directive");

1119

1121 checkVersion(Directive, StringRef(), Loc, ExpectedOS);

1122 getStreamer().emitVersionMin(Type, Major, Minor, Update, SDKVersion);

1123 return false;

1124}

1125

1127 switch (Type) {

1128 case MachO::PLATFORM_UNKNOWN:

1129 break;

1131 case MachO::PLATFORM_IOS: return Triple::IOS;

1132 case MachO::PLATFORM_TVOS: return Triple::TvOS;

1134 case MachO::PLATFORM_XROS: return Triple::XROS;

1135 case MachO::PLATFORM_BRIDGEOS: break;

1136 case MachO::PLATFORM_DRIVERKIT:

1138 case MachO::PLATFORM_MACCATALYST: return Triple::IOS;

1139 case MachO::PLATFORM_IOSSIMULATOR: break;

1140 case MachO::PLATFORM_TVOSSIMULATOR: break;

1141 case MachO::PLATFORM_WATCHOSSIMULATOR: break;

1142 case MachO::PLATFORM_XROS_SIMULATOR: break;

1143 }

1145}

1146

1147

1148

1149bool DarwinAsmParser::parseBuildVersion(StringRef Directive, SMLoc Loc) {

1150 StringRef PlatformName;

1151 SMLoc PlatformLoc = getTok().getLoc();

1152 if (getParser().parseIdentifier(PlatformName))

1153 return TokError("platform name expected");

1154

1155 unsigned Platform = StringSwitch(PlatformName)

1156#define PLATFORM(platform, id, name, build_name, target, tapi_target, \

1157 marketing) \

1158 .Case(#build_name, MachO::PLATFORM_##platform)

1159#include "llvm/BinaryFormat/MachO.def"

1160 .Default(MachO::PLATFORM_UNKNOWN);

1161

1162 if (Platform == MachO::PLATFORM_UNKNOWN)

1163 return Error(PlatformLoc, "unknown platform name");

1164

1166 return TokError("version number required, comma expected");

1167 Lex();

1168

1169 unsigned Major;

1170 unsigned Minor;

1171 unsigned Update;

1173 return true;

1174

1175 VersionTuple SDKVersion;

1176 if (isSDKVersionToken(getLexer().getTok()) && parseSDKVersion(SDKVersion))

1177 return true;

1178

1179 if (parseEOL())

1180 return addErrorSuffix(" in '.build_version' directive");

1181

1184 checkVersion(Directive, PlatformName, Loc, ExpectedOS);

1185 getStreamer().emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);

1186 return false;

1187}

1188

1189

1190

1191bool DarwinAsmParser::parseDirectiveCGProfile(StringRef S, SMLoc Loc) {

1193}

1194

1196 return new DarwinAsmParser;

1197}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static bool isNot(const MachineRegisterInfo &MRI, const MachineInstr &MI)

static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

static Version parseVersion(StringRef Name)

static bool isSDKVersionToken(const AsmToken &Tok)

Definition DarwinAsmParser.cpp:989

static Triple::OSType getOSTypeFromMCVM(MCVersionMinType Type)

Definition DarwinAsmParser.cpp:1090

static Triple::OSType getOSTypeFromPlatform(MachO::PlatformType Type)

Definition DarwinAsmParser.cpp:1126

This file defines the SmallVector class.

This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...

Target independent representation for an assembler token.

bool is(TokenKind K) const

StringRef getIdentifier() const

Get the identifier string for the current token, which should be an identifier or a string.

Generic interface for extending the MCAsmParser, which is implemented by target and object file assem...

virtual void Initialize(MCAsmParser &Parser)

Initialize the extension for parsing using the given Parser.

bool parseDirectiveCGProfile(StringRef, SMLoc)

parseDirectiveCGProfile ::= .cg_profile identifier, identifier,

std::pair< MCAsmParserExtension *, DirectiveHandler > ExtensionDirectiveHandler

static Error ParseSectionSpecifier(StringRef Spec, StringRef &Segment, StringRef &Section, unsigned &TAA, bool &TAAParsed, unsigned &StubSize)

Parse the section specifier indicated by "Spec".

MachO::SectionType getType() const

bool isDefined() const

isDefined - Check if this symbol is defined (i.e., it has an address).

bool isUndefined() const

isUndefined - Check if this symbol undefined (i.e., implicitly defined).

StringRef getName() const

getName - Get the symbol name.

bool isTemporary() const

isTemporary - Check if this is an assembler temporary symbol.

static SMLoc getFromPointer(const char *Ptr)

constexpr const char * getPointer() const

constexpr bool isValid() const

static SectionKind getText()

static SectionKind getData()

static SectionKind getBSS()

static SectionKind getThreadBSS()

StringRef - Represent a constant reference to a string, i.e.

constexpr bool empty() const

empty - Check if the string is empty.

The instances of the Type class are immutable: once they are created, they are never changed.

#define llvm_unreachable(msg)

Marks that the current location is not supposed to be reachable.

constexpr char Align[]

Key for Kernel::Arg::Metadata::mAlign.

constexpr char Args[]

Key for Kernel::Metadata::mArgs.

SectionType

These are the section type and attributes fields.

@ S_THREAD_LOCAL_VARIABLE_POINTERS

S_THREAD_LOCAL_VARIABLE_POINTERS - Section with pointers to thread local structures.

@ S_16BYTE_LITERALS

S_16BYTE_LITERALS - Section with only 16 byte literals.

@ S_THREAD_LOCAL_INIT_FUNCTION_POINTERS

S_THREAD_LOCAL_INIT_FUNCTION_POINTERS - Section with thread local variable initialization pointers to...

@ S_THREAD_LOCAL_ZEROFILL

S_THREAD_LOCAL_ZEROFILL - Thread local zerofill section.

@ S_LAZY_SYMBOL_POINTERS

S_LAZY_SYMBOL_POINTERS - Section with lazy symbol pointers.

@ S_MOD_TERM_FUNC_POINTERS

S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.

@ S_MOD_INIT_FUNC_POINTERS

S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.

@ S_CSTRING_LITERALS

S_CSTRING_LITERALS - Section with literal C strings.

@ S_THREAD_LOCAL_REGULAR

S_THREAD_LOCAL_REGULAR - Thread local data section.

@ S_ZEROFILL

S_ZEROFILL - Zero fill on demand section.

@ S_NON_LAZY_SYMBOL_POINTERS

S_NON_LAZY_SYMBOL_POINTERS - Section with non-lazy symbol pointers.

@ S_4BYTE_LITERALS

S_4BYTE_LITERALS - Section with 4 byte literals.

@ S_LITERAL_POINTERS

S_LITERAL_POINTERS - Section with pointers to literals.

@ S_8BYTE_LITERALS

S_8BYTE_LITERALS - Section with 8 byte literals.

@ S_THREAD_LOCAL_VARIABLES

S_THREAD_LOCAL_VARIABLES - Section with thread local variable structure data.

@ S_SYMBOL_STUBS

S_SYMBOL_STUBS - Section with symbol stubs, byte size of stub in the Reserved2 field.

LLVM_ABI SimpleSymbol parseSymbol(StringRef SymName)

Get symbol classification by parsing the name of a symbol.

@ S_ATTR_NO_DEAD_STRIP

S_ATTR_NO_DEAD_STRIP - No dead stripping.

@ S_ATTR_PURE_INSTRUCTIONS

S_ATTR_PURE_INSTRUCTIONS - Section contains only true machine instructions.

Context & getContext() const

@ OF_TextWithCRLF

The file should be opened in text mode and use a carriage linefeed '\r '.

@ OF_Append

The file should be opened in append mode.

This is an optimization pass for GlobalISel generic memory operations.

FunctionAddr VTableAddr Value

@ MCDR_DataRegionEnd

.end_data_region

@ MCDR_DataRegion

.data_region

@ MCDR_DataRegionJT8

.data_region jt8

@ MCDR_DataRegionJT32

.data_region jt32

@ MCDR_DataRegionJT16

.data_region jt16

@ MCVM_WatchOSVersionMin

.watchos_version_min

@ MCVM_OSXVersionMin

.macosx_version_min

@ MCVM_TvOSVersionMin

.tvos_version_min

@ MCVM_IOSVersionMin

.ios_version_min

FunctionAddr VTableAddr uintptr_t uintptr_t Data

std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)

std::pair< MCSection *, uint32_t > MCSectionSubPair

MCAsmParserExtension * createDarwinAsmParser()

Definition DarwinAsmParser.cpp:1195

@ MCSA_AltEntry

.alt_entry (MachO)

@ MCSA_IndirectSymbol

.indirect_symbol (MachO)