X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-mc%2Fllvm-mc.cpp;h=72294caef3bc00dabfee6c2db3bbc113f4cd55a7;hb=26a84a6e7c37b49531feb59466bfe8954403074c;hp=f10a614a2236a06a633a9e1c6f9b587ee9e6c0dd;hpb=c1b49b56d4132efa2e06deb8f23508d0de4c8800;p=oota-llvm.git diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index f10a614a223..72294caef3b 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -13,7 +13,6 @@ //===----------------------------------------------------------------------===// #include "Disassembler.h" -#include "llvm/ADT/OwningPtr.h" #include "llvm/MC/MCAsmBackend.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" @@ -26,7 +25,9 @@ #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/MC/MCTargetAsmParser.h" +#include "llvm/MC/MCTargetOptionsCommandFlags.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/Compression.h" #include "llvm/Support/FileUtilities.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Host.h" @@ -50,6 +51,10 @@ OutputFilename("o", cl::desc("Output filename"), static cl::opt ShowEncoding("show-encoding", cl::desc("Show instruction encodings")); +static cl::opt +CompressDebugSections("compress-debug-sections", + cl::desc("Compress DWARF debug sections")); + static cl::opt ShowInst("show-inst", cl::desc("Show internal instruction representation")); @@ -62,13 +67,8 @@ OutputAsmVariant("output-asm-variant", cl::desc("Syntax variant to use for output printing")); static cl::opt -RelaxAll("mc-relax-all", cl::desc("Relax all fixups")); - -static cl::opt -DisableCFI("disable-cfi", cl::desc("Do not use .cfi_* directives")); - -static cl::opt -NoExecStack("mc-no-exec-stack", cl::desc("File doesn't need an exec stack")); +PrintImmHex("print-imm-hex", cl::init(false), + cl::desc("Prefer hex format for immediate values")); enum OutputFileType { OFT_Null, @@ -146,9 +146,6 @@ static cl::opt NoInitialTextSection("n", cl::desc("Don't assume assembly file starts " "in the text section")); -static cl::opt -SaveTempLabels("L", cl::desc("Don't discard temporary labels")); - static cl::opt GenDwarfForAssembly("g", cl::desc("Generate dwarf debugging info for assembly " "source files")); @@ -161,12 +158,17 @@ static cl::opt MainFileName("main-file-name", cl::desc("Specifies the name we should consider the input file")); +static cl::opt SaveTempLabels("save-temp-labels", + cl::desc("Don't discard temporary labels")); + +static cl::opt NoExecStack("no-exec-stack", + cl::desc("File doesn't need an exec stack")); + enum ActionType { AC_AsLex, AC_Assemble, AC_Disassemble, AC_MDisassemble, - AC_HDisassemble }; static cl::opt @@ -180,9 +182,6 @@ Action(cl::desc("Action to perform:"), "Disassemble strings of hex bytes"), clEnumValN(AC_MDisassemble, "mdis", "Marked up disassembly of strings of hex bytes"), - clEnumValN(AC_HDisassemble, "hdis", - "Disassemble strings of hex bytes printing " - "immediates as hex"), clEnumValEnd)); static const Target *GetTarget(const char *ProgName) { @@ -197,7 +196,7 @@ static const Target *GetTarget(const char *ProgName) { Error); if (!TheTarget) { errs() << ProgName << ": " << Error; - return 0; + return nullptr; } // Update the triple name and return the found target. @@ -211,11 +210,11 @@ static tool_output_file *GetOutputStream() { std::string Err; tool_output_file *Out = - new tool_output_file(OutputFilename.c_str(), Err, sys::fs::F_Binary); + new tool_output_file(OutputFilename.c_str(), Err, sys::fs::F_None); if (!Err.empty()) { errs() << Err << '\n'; delete Out; - return 0; + return nullptr; } return Out; @@ -239,10 +238,11 @@ static void setDwarfDebugProducer(void) { DwarfDebugProducer += getenv("DEBUG_PRODUCER"); } -static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI, tool_output_file *Out) { +static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI, + tool_output_file *Out) { AsmLexer Lexer(MAI); - Lexer.setBuffer(SrcMgr.getMemoryBuffer(0)); + Lexer.setBuffer(SrcMgr.getMemoryBuffer(SrcMgr.getMainFileID())->getBuffer()); bool Error = false; while (Lexer.Lex().isNot(AsmToken::Eof)) { @@ -317,12 +317,15 @@ static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI, tool_output_file *Out) return Error; } -static int AssembleInput(const char *ProgName, const Target *TheTarget, +static int AssembleInput(const char *ProgName, const Target *TheTarget, SourceMgr &SrcMgr, MCContext &Ctx, MCStreamer &Str, - MCAsmInfo &MAI, MCSubtargetInfo &STI) { - OwningPtr Parser(createMCAsmParser(SrcMgr, Ctx, - Str, MAI)); - OwningPtr TAP(TheTarget->createMCAsmParser(STI, *Parser)); + MCAsmInfo &MAI, MCSubtargetInfo &STI, + MCInstrInfo &MCII, MCTargetOptions &MCOptions) { + std::unique_ptr Parser( + createMCAsmParser(SrcMgr, Ctx, Str, MAI)); + std::unique_ptr TAP( + TheTarget->createMCAsmParser(STI, *Parser, MCII, MCOptions)); + if (!TAP) { errs() << ProgName << ": error: this target does not support assembly parsing.\n"; @@ -353,6 +356,7 @@ int main(int argc, char **argv) { cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion); cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); + MCTargetOptions MCOptions = InitMCTargetOptionsFromFlags(); TripleName = Triple::normalize(TripleName); setDwarfDebugFlags(argc, argv); @@ -363,12 +367,13 @@ int main(int argc, char **argv) { if (!TheTarget) return 1; - OwningPtr BufferPtr; - if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { + std::unique_ptr BufferPtr; + if (std::error_code ec = + MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { errs() << ProgName << ": " << ec.message() << '\n'; return 1; } - MemoryBuffer *Buffer = BufferPtr.take(); + MemoryBuffer *Buffer = BufferPtr.release(); SourceMgr SrcMgr; @@ -379,22 +384,39 @@ int main(int argc, char **argv) { // it later. SrcMgr.setIncludeDirs(IncludeDirs); - llvm::OwningPtr MRI(TheTarget->createMCRegInfo(TripleName)); + std::unique_ptr MRI(TheTarget->createMCRegInfo(TripleName)); assert(MRI && "Unable to create target register info!"); - llvm::OwningPtr MAI(TheTarget->createMCAsmInfo(*MRI, TripleName)); + std::unique_ptr MAI(TheTarget->createMCAsmInfo(*MRI, TripleName)); assert(MAI && "Unable to create target asm info!"); + if (CompressDebugSections) { + if (!zlib::isAvailable()) { + errs() << ProgName + << ": build tools with zlib to enable -compress-debug-sections"; + return 1; + } + MAI->setCompressDebugSections(true); + } + // FIXME: This is not pretty. MCContext has a ptr to MCObjectFileInfo and // MCObjectFileInfo needs a MCContext reference in order to initialize itself. - OwningPtr MOFI(new MCObjectFileInfo()); - MCContext Ctx(MAI.get(), MRI.get(), MOFI.get(), &SrcMgr); - MOFI->InitMCObjectFileInfo(TripleName, RelocModel, CMModel, Ctx); + MCObjectFileInfo MOFI; + MCContext Ctx(MAI.get(), MRI.get(), &MOFI, &SrcMgr); + MOFI.InitMCObjectFileInfo(TripleName, RelocModel, CMModel, Ctx); if (SaveTempLabels) Ctx.setAllowTemporaryLabels(false); Ctx.setGenDwarfForAssembly(GenDwarfForAssembly); + // Default to 4 for dwarf version. + unsigned DwarfVersion = MCOptions.DwarfVersion ? MCOptions.DwarfVersion : 4; + if (DwarfVersion < 2 || DwarfVersion > 4) { + errs() << ProgName << ": Dwarf version " << DwarfVersion + << " is not supported." << '\n'; + return 1; + } + Ctx.setDwarfVersion(DwarfVersion); if (!DwarfDebugFlags.empty()) Ctx.setDwarfDebugFlags(StringRef(DwarfDebugFlags)); if (!DwarfDebugProducer.empty()) @@ -413,42 +435,44 @@ int main(int argc, char **argv) { FeaturesStr = Features.getString(); } - OwningPtr Out(GetOutputStream()); + std::unique_ptr Out(GetOutputStream()); if (!Out) return 1; formatted_raw_ostream FOS(Out->os()); - OwningPtr Str; + std::unique_ptr Str; - OwningPtr MCII(TheTarget->createMCInstrInfo()); - OwningPtr - STI(TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); + std::unique_ptr MCII(TheTarget->createMCInstrInfo()); + std::unique_ptr STI( + TheTarget->createMCSubtargetInfo(TripleName, MCPU, FeaturesStr)); - MCInstPrinter *IP = NULL; + MCInstPrinter *IP = nullptr; if (FileType == OFT_AssemblyFile) { IP = TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI, *MCII, *MRI, *STI); - MCCodeEmitter *CE = 0; - MCAsmBackend *MAB = 0; + + // Set the display preference for hex vs. decimal immediates. + IP->setPrintImmHex(PrintImmHex); + + // Set up the AsmStreamer. + MCCodeEmitter *CE = nullptr; + MCAsmBackend *MAB = nullptr; if (ShowEncoding) { CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); - MAB = TheTarget->createMCAsmBackend(TripleName, MCPU); + MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); } - bool UseCFI = !DisableCFI; - Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/true, - /*useLoc*/ true, - UseCFI, - /*useDwarfDirectory*/ true, - IP, CE, MAB, ShowInst)); + Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/ true, + /*useDwarfDirectory*/ true, IP, CE, + MAB, ShowInst)); } else if (FileType == OFT_Null) { Str.reset(createNullStreamer(Ctx)); } else { assert(FileType == OFT_ObjectFile && "Invalid file type!"); MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, *STI, Ctx); - MCAsmBackend *MAB = TheTarget->createMCAsmBackend(TripleName, MCPU); + MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU); Str.reset(TheTarget->createMCObjectStreamer(TripleName, Ctx, *MAB, - FOS, CE, RelaxAll, + FOS, CE, *STI, RelaxAll, NoExecStack)); } @@ -459,18 +483,14 @@ int main(int argc, char **argv) { Res = AsLexInput(SrcMgr, *MAI, Out.get()); break; case AC_Assemble: - Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI); + Res = AssembleInput(ProgName, TheTarget, SrcMgr, Ctx, *Str, *MAI, *STI, + *MCII, MCOptions); break; case AC_MDisassemble: assert(IP && "Expected assembly output"); IP->setUseMarkup(1); disassemble = true; break; - case AC_HDisassemble: - assert(IP && "Expected assembly output"); - IP->setPrintImmHex(1); - disassemble = true; - break; case AC_Disassemble: disassemble = true; break;