OLD | NEW |
1 //===-- llvm-mc.cpp - Machine Code Hacking Driver -------------------------===// | 1 //===-- llvm-mc.cpp - Machine Code Hacking Driver -------------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This utility is a simple driver that allows command line hacking on machine | 10 // This utility is a simple driver that allows command line hacking on machine |
11 // code. | 11 // code. |
12 // | 12 // |
13 //===----------------------------------------------------------------------===// | 13 //===----------------------------------------------------------------------===// |
14 | 14 |
15 #include "Disassembler.h" | 15 #include "Disassembler.h" |
16 #include "llvm/MC/MCAsmBackend.h" | 16 #include "llvm/MC/MCAsmBackend.h" |
17 #include "llvm/MC/MCAsmInfo.h" | 17 #include "llvm/MC/MCAsmInfo.h" |
18 #include "llvm/MC/MCContext.h" | 18 #include "llvm/MC/MCContext.h" |
19 #include "llvm/MC/MCInstPrinter.h" | 19 #include "llvm/MC/MCInstPrinter.h" |
20 #include "llvm/MC/MCInstrInfo.h" | 20 #include "llvm/MC/MCInstrInfo.h" |
| 21 #include "llvm/MC/MCNaCl.h" |
21 #include "llvm/MC/MCObjectFileInfo.h" | 22 #include "llvm/MC/MCObjectFileInfo.h" |
22 #include "llvm/MC/MCParser/AsmLexer.h" | 23 #include "llvm/MC/MCParser/AsmLexer.h" |
23 #include "llvm/MC/MCRegisterInfo.h" | 24 #include "llvm/MC/MCRegisterInfo.h" |
24 #include "llvm/MC/MCSectionMachO.h" | 25 #include "llvm/MC/MCSectionMachO.h" |
25 #include "llvm/MC/MCStreamer.h" | 26 #include "llvm/MC/MCStreamer.h" |
26 #include "llvm/MC/MCSubtargetInfo.h" | 27 #include "llvm/MC/MCSubtargetInfo.h" |
27 #include "llvm/MC/MCTargetAsmParser.h" | 28 #include "llvm/MC/MCTargetAsmParser.h" |
28 #include "llvm/MC/MCTargetOptionsCommandFlags.h" | 29 #include "llvm/MC/MCTargetOptionsCommandFlags.h" |
29 #include "llvm/Support/CommandLine.h" | 30 #include "llvm/Support/CommandLine.h" |
30 #include "llvm/Support/Compression.h" | 31 #include "llvm/Support/Compression.h" |
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
439 if (!Out) | 440 if (!Out) |
440 return 1; | 441 return 1; |
441 | 442 |
442 formatted_raw_ostream FOS(Out->os()); | 443 formatted_raw_ostream FOS(Out->os()); |
443 std::unique_ptr<MCStreamer> Str; | 444 std::unique_ptr<MCStreamer> Str; |
444 | 445 |
445 std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo()); | 446 std::unique_ptr<MCInstrInfo> MCII(TheTarget->createMCInstrInfo()); |
446 std::unique_ptr<MCSubtargetInfo> STI( | 447 std::unique_ptr<MCSubtargetInfo> STI( |
447 TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); | 448 TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); |
448 | 449 |
449 MCInstPrinter *IP = nullptr; | 450 Triple T(TripleName); // @LOCALMOD |
| 451 |
| 452 MCInstPrinter *IP = NULL; |
450 if (FileType == OFT_AssemblyFile) { | 453 if (FileType == OFT_AssemblyFile) { |
451 IP = | 454 IP = |
452 TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI, *MCII, *MRI, *STI); | 455 TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI, *MCII, *MRI, *STI); |
453 | 456 |
454 // Set the display preference for hex vs. decimal immediates. | 457 // Set the display preference for hex vs. decimal immediates. |
455 IP->setPrintImmHex(PrintImmHex); | 458 IP->setPrintImmHex(PrintImmHex); |
456 | 459 |
457 // Set up the AsmStreamer. | 460 // Set up the AsmStreamer. |
458 MCCodeEmitter *CE = nullptr; | 461 MCCodeEmitter *CE = nullptr; |
459 MCAsmBackend *MAB = nullptr; | 462 MCAsmBackend *MAB = nullptr; |
460 if (ShowEncoding) { | 463 if (ShowEncoding || T.isOSNaCl()) { // @LOCALMOD |
461 CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); | 464 CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); |
462 MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); | 465 MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); |
463 } | 466 } |
464 Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/ true, | 467 Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/ true, |
465 /*useDwarfDirectory*/ true, IP, CE, | 468 /*useDwarfDirectory*/ true, IP, CE, |
466 MAB, ShowInst)); | 469 MAB, ShowInst)); |
467 | 470 |
468 } else if (FileType == OFT_Null) { | 471 } else if (FileType == OFT_Null) { |
469 Str.reset(createNullStreamer(Ctx)); | 472 Str.reset(createNullStreamer(Ctx)); |
470 } else { | 473 } else { |
471 assert(FileType == OFT_ObjectFile && "Invalid file type!"); | 474 assert(FileType == OFT_ObjectFile && "Invalid file type!"); |
472 MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); | 475 MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); |
473 MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); | 476 MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); |
474 Str.reset(TheTarget->createMCObjectStreamer(TripleName, Ctx, *MAB, FOS, CE, | 477 Str.reset(TheTarget->createMCObjectStreamer(TripleName, Ctx, *MAB, FOS, CE, |
475 *STI, RelaxAll)); | 478 *STI, RelaxAll)); |
476 if (NoExecStack) | 479 if (NoExecStack) |
477 Str->InitSections(true); | 480 Str->InitSections(true); |
| 481 // @LOCALMOD-BEGIN |
| 482 if (T.isOSNaCl()) { |
| 483 // If the above non-localmod does InitSections unconditionally, |
| 484 // we can use that. |
| 485 Str->InitSections(NoExecStack); |
| 486 initializeNaClMCStreamer(*Str.get(), Ctx, T); |
| 487 } |
| 488 // @LOCALMOD-END |
478 } | 489 } |
479 | 490 |
480 int Res = 1; | 491 int Res = 1; |
481 bool disassemble = false; | 492 bool disassemble = false; |
482 switch (Action) { | 493 switch (Action) { |
483 case AC_AsLex: | 494 case AC_AsLex: |
484 Res = AsLexInput(SrcMgr, *MAI, Out.get()); | 495 Res = AsLexInput(SrcMgr, *MAI, Out.get()); |
485 break; | 496 break; |
486 case AC_Assemble: | 497 case AC_Assemble: |
487 Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI, | 498 Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI, |
488 *MCII, MCOptions); | 499 *MCII, MCOptions); |
489 break; | 500 break; |
490 case AC_MDisassemble: | 501 case AC_MDisassemble: |
491 assert(IP && "Expected assembly output"); | 502 assert(IP && "Expected assembly output"); |
492 IP->setUseMarkup(1); | 503 IP->setUseMarkup(1); |
493 disassemble = true; | 504 disassemble = true; |
494 break; | 505 break; |
495 case AC_Disassemble: | 506 case AC_Disassemble: |
496 disassemble = true; | 507 disassemble = true; |
497 break; | 508 break; |
498 } | 509 } |
499 if (disassemble) | 510 if (disassemble) |
500 Res = Disassembler::disassemble(*TheTarget, TripleName, *STI, *Str, | 511 Res = Disassembler::disassemble(*TheTarget, TripleName, *STI, *Str, |
501 *Buffer, SrcMgr, Out->os()); | 512 *Buffer, SrcMgr, Out->os()); |
502 | 513 |
503 // Keep output if no errors. | 514 // Keep output if no errors. |
504 if (Res == 0) Out->keep(); | 515 if (Res == 0) Out->keep(); |
505 return Res; | 516 return Res; |
506 } | 517 } |
OLD | NEW |