Chromium Code Reviews| Index: lib/MC/MCNaCl.cpp |
| diff --git a/lib/MC/MCNaCl.cpp b/lib/MC/MCNaCl.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b88d183453ec1d8eb493f7c10784bfc7c059e490 |
| --- /dev/null |
| +++ b/lib/MC/MCNaCl.cpp |
| @@ -0,0 +1,76 @@ |
| +//===- lib/MC/MCNaCl.cpp - NaCl-specific MC implementation ----------------===// |
| +// |
| +// The LLVM Compiler Infrastructure |
| +// |
| +// This file is distributed under the University of Illinois Open Source |
| +// License. See LICENSE.TXT for details. |
| +// |
| +//===----------------------------------------------------------------------===// |
| + |
| +#include "llvm/MC/MCNaCl.h" |
| +#include "llvm/ADT/Triple.h" |
| +#include "llvm/MC/MCContext.h" |
| +#include "llvm/MC/MCSectionELF.h" |
| +#include "llvm/MC/MCStreamer.h" |
| +#include "llvm/Support/ELF.h" |
| + |
| +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.
|
| + |
| +namespace llvm { |
| +void initializeNaClMCStreamer(MCStreamer &Streamer, MCContext &Ctx, |
| + const Triple &TheTriple) { |
| + assert(TheTriple.isOSNaCl()); |
| + errs() << "initializeNaClMCStreamer\n"; |
|
Mark Seaborn
2013/05/10 19:52:46
Remove this debugging output
Derek Schuff
2013/05/10 22:59:26
Done.
|
| + const char *NoteName; |
| + const char *NoteArch; |
| + unsigned BundleAlign; |
| + switch (TheTriple.getArch()) { |
| + case Triple::arm: |
| + NoteName = ".note.NaCl.ABI.arm"; |
| + NoteArch = "arm"; |
| + BundleAlign = 4; |
| + break; |
| + case Triple::mipsel: |
| + NoteName = ".note.NaCl.ABI.mipsel"; |
| + NoteArch = "mipsel"; |
| + BundleAlign = 4; |
| + break; |
| + case Triple::x86: |
| + NoteName = ".note.NaCl.ABI.x86-32"; |
| + NoteArch = "x86-32"; |
| + BundleAlign = 5; |
| + break; |
| + case Triple::x86_64: |
| + NoteName = ".note.NaCl.ABI.x86-64"; |
| + NoteArch = "x86-64"; |
| + BundleAlign = 5; |
| + break; |
| + default: |
| + report_fatal_error("Unsupported architecture for NaCl"); |
| + } |
| + |
| + // Set bundle-alignment as required by the NaCl ABI for the target. |
| + Streamer.EmitBundleAlignMode(BundleAlign); |
| + |
| + // Emit an ELF Note section in its own COMDAT group which identifies NaCl |
| + // object files to the gold linker, so it can use the NaCl layout. |
| + const MCSection *Note = Ctx.getELFSection( |
| + 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.
|
| + SectionKind::getReadOnly(), 0, NoteName); |
| + |
| + // TODO(dschuff) This should probably use PushSection and PopSection, but |
| + // PopSection will assert if there haven't been any other sections switched to |
| + // yet. |
| + Streamer.SwitchSection(Note); |
| + Streamer.EmitIntValue(strlen(NoteNamespace) + 1, 4); |
| + Streamer.EmitIntValue(strlen(NoteArch) + 1, 4); |
| + Streamer.EmitIntValue(1, 4); // NT_VERSION or maybe just our version number |
| + 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.
|
| + Streamer.EmitBytes(NoteNamespace); |
| + Streamer.EmitIntValue(0, 1); // NUL terminator |
| + Streamer.EmitValueToAlignment(4); |
| + Streamer.EmitBytes(NoteArch); |
| + Streamer.EmitIntValue(0, 1); // NUL terminator |
| + Streamer.EmitValueToAlignment(4); |
| +} |
| +} // namespace llvm |