Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 //===- lib/MC/MCNaCl.cpp - NaCl-specific MC implementation ----------------===// | |
| 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 #include "llvm/MC/MCNaCl.h" | |
| 11 #include "llvm/ADT/Triple.h" | |
| 12 #include "llvm/MC/MCContext.h" | |
| 13 #include "llvm/MC/MCSectionELF.h" | |
| 14 #include "llvm/MC/MCStreamer.h" | |
| 15 #include "llvm/Support/ELF.h" | |
| 16 | |
| 17 static const char *NoteNamespace = "NaCl"; | |
|
Mark Seaborn
2013/05/10 19:52:46
static const char NoteNamespace[] = "NaCl";
That
Derek Schuff
2013/05/10 22:59:26
Done.
| |
| 18 | |
| 19 namespace llvm { | |
| 20 void initializeNaClMCStreamer(MCStreamer &Streamer, MCContext &Ctx, | |
| 21 const Triple &TheTriple) { | |
| 22 assert(TheTriple.isOSNaCl()); | |
| 23 errs() << "initializeNaClMCStreamer\n"; | |
|
Mark Seaborn
2013/05/10 19:52:46
Remove this debugging output
Derek Schuff
2013/05/10 22:59:26
Done.
| |
| 24 const char *NoteName; | |
| 25 const char *NoteArch; | |
| 26 unsigned BundleAlign; | |
| 27 switch (TheTriple.getArch()) { | |
| 28 case Triple::arm: | |
| 29 NoteName = ".note.NaCl.ABI.arm"; | |
| 30 NoteArch = "arm"; | |
| 31 BundleAlign = 4; | |
| 32 break; | |
| 33 case Triple::mipsel: | |
| 34 NoteName = ".note.NaCl.ABI.mipsel"; | |
| 35 NoteArch = "mipsel"; | |
| 36 BundleAlign = 4; | |
| 37 break; | |
| 38 case Triple::x86: | |
| 39 NoteName = ".note.NaCl.ABI.x86-32"; | |
| 40 NoteArch = "x86-32"; | |
| 41 BundleAlign = 5; | |
| 42 break; | |
| 43 case Triple::x86_64: | |
| 44 NoteName = ".note.NaCl.ABI.x86-64"; | |
| 45 NoteArch = "x86-64"; | |
| 46 BundleAlign = 5; | |
| 47 break; | |
| 48 default: | |
| 49 report_fatal_error("Unsupported architecture for NaCl"); | |
| 50 } | |
| 51 | |
| 52 // Set bundle-alignment as required by the NaCl ABI for the target. | |
| 53 Streamer.EmitBundleAlignMode(BundleAlign); | |
| 54 | |
| 55 // Emit an ELF Note section in its own COMDAT group which identifies NaCl | |
| 56 // object files to the gold linker, so it can use the NaCl layout. | |
| 57 const MCSection *Note = Ctx.getELFSection( | |
| 58 NoteName, ELF::SHT_NOTE, ELF::SHF_ALLOC | ELF::SHF_GROUP, | |
|
Mark Seaborn
2013/05/10 19:52:46
Nit: Indent by 4 rather than 6?
Derek Schuff
2013/05/10 22:59:26
Done.
| |
| 59 SectionKind::getReadOnly(), 0, NoteName); | |
| 60 | |
| 61 // TODO(dschuff) This should probably use PushSection and PopSection, but | |
| 62 // PopSection will assert if there haven't been any other sections switched to | |
| 63 // yet. | |
| 64 Streamer.SwitchSection(Note); | |
| 65 Streamer.EmitIntValue(strlen(NoteNamespace) + 1, 4); | |
| 66 Streamer.EmitIntValue(strlen(NoteArch) + 1, 4); | |
| 67 Streamer.EmitIntValue(1, 4); // NT_VERSION or maybe just our version number | |
| 68 Streamer.EmitValueToAlignment(4); | |
|
Mark Seaborn
2013/05/10 19:52:46
This one isn't needed, BTW.
Derek Schuff
2013/05/10 22:59:26
Done.
| |
| 69 Streamer.EmitBytes(NoteNamespace); | |
| 70 Streamer.EmitIntValue(0, 1); // NUL terminator | |
| 71 Streamer.EmitValueToAlignment(4); | |
| 72 Streamer.EmitBytes(NoteArch); | |
| 73 Streamer.EmitIntValue(0, 1); // NUL terminator | |
| 74 Streamer.EmitValueToAlignment(4); | |
| 75 } | |
| 76 } // namespace llvm | |
| OLD | NEW |