MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os, bool isVerboseAsm, bool useCFI, bool useDwarfDirectory, MCInstPrinter *printer, MCCodeEmitter *emitter, MCAsmBackend *asmbackend, bool showInst) : MCStreamer(Context), OS(os), MAI(Context.getAsmInfo()), InstPrinter(printer), Emitter(emitter), AsmBackend(asmbackend), CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm), ShowInst(showInst), UseCFI(useCFI), UseDwarfDirectory(useDwarfDirectory) { if (InstPrinter && IsVerboseAsm) InstPrinter->setCommentStream(CommentStream); }
static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, MCSymbolRefExpr::VariantKind Modifier, X86_64RelType Type, bool IsPCRel, unsigned Kind) { switch (Modifier) { default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: switch (Type) { case RT64_64: return IsPCRel ? ELF::R_X86_64_PC64 : ELF::R_X86_64_64; case RT64_32: return IsPCRel ? ELF::R_X86_64_PC32 : ELF::R_X86_64_32; case RT64_32S: return ELF::R_X86_64_32S; case RT64_16: return IsPCRel ? ELF::R_X86_64_PC16 : ELF::R_X86_64_16; case RT64_8: return IsPCRel ? ELF::R_X86_64_PC8 : ELF::R_X86_64_8; } case MCSymbolRefExpr::VK_GOT: switch (Type) { case RT64_64: return IsPCRel ? ELF::R_X86_64_GOTPC64 : ELF::R_X86_64_GOT64; case RT64_32: return IsPCRel ? ELF::R_X86_64_GOTPC32 : ELF::R_X86_64_GOT32; case RT64_32S: case RT64_16: case RT64_8: llvm_unreachable("Unimplemented"); } case MCSymbolRefExpr::VK_GOTOFF: assert(Type == RT64_64); assert(!IsPCRel); return ELF::R_X86_64_GOTOFF64; case MCSymbolRefExpr::VK_TPOFF: assert(!IsPCRel); switch (Type) { case RT64_64: return ELF::R_X86_64_TPOFF64; case RT64_32: return ELF::R_X86_64_TPOFF32; case RT64_32S: case RT64_16: case RT64_8: llvm_unreachable("Unimplemented"); } case MCSymbolRefExpr::VK_DTPOFF: assert(!IsPCRel); switch (Type) { case RT64_64: return ELF::R_X86_64_DTPOFF64; case RT64_32: return ELF::R_X86_64_DTPOFF32; case RT64_32S: case RT64_16: case RT64_8: llvm_unreachable("Unimplemented"); } case MCSymbolRefExpr::VK_SIZE: assert(!IsPCRel); switch (Type) { case RT64_64: return ELF::R_X86_64_SIZE64; case RT64_32: return ELF::R_X86_64_SIZE32; case RT64_32S: case RT64_16: case RT64_8: llvm_unreachable("Unimplemented"); } case MCSymbolRefExpr::VK_TLSCALL: return ELF::R_X86_64_TLSDESC_CALL; case MCSymbolRefExpr::VK_TLSDESC: return ELF::R_X86_64_GOTPC32_TLSDESC; case MCSymbolRefExpr::VK_TLSGD: checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_TLSGD; case MCSymbolRefExpr::VK_GOTTPOFF: checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_GOTTPOFF; case MCSymbolRefExpr::VK_TLSLD: checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_TLSLD; case MCSymbolRefExpr::VK_PLT: checkIs32(Ctx, Loc, Type); return ELF::R_X86_64_PLT32; case MCSymbolRefExpr::VK_GOTPCREL: checkIs32(Ctx, Loc, Type); // Older versions of ld.bfd/ld.gold/lld // do not support GOTPCRELX/REX_GOTPCRELX, // and we want to keep back-compatibility. if (!Ctx.getAsmInfo()->canRelaxRelocations()) return ELF::R_X86_64_GOTPCREL; switch (Kind) { default: return ELF::R_X86_64_GOTPCREL; case X86::reloc_riprel_4byte_relax: return ELF::R_X86_64_GOTPCRELX; case X86::reloc_riprel_4byte_relax_rex: case X86::reloc_riprel_4byte_movq_load: return ELF::R_X86_64_REX_GOTPCRELX; } } }