[llvm-commits] [llvm] r133286 - in /llvm/trunk: include/llvm/MC/MCStreamer.h include/llvm/Target/TargetRegistry.h lib/CodeGen/LLVMTargetMachine.cpp lib/MC/MCAsmStreamer.cpp lib/Target/PTX/PTXMCAsmStreamer.cpp lib/Target/PTX/PTXTargetMachine.cpp tools/llvm-mc/llvm-mc.cpp
Bill Wendling
isanbard at gmail.com
Fri Jun 17 13:35:21 PDT 2011
Author: void
Date: Fri Jun 17 15:35:21 2011
New Revision: 133286
URL: http://llvm.org/viewvc/llvm-project?rev=133286&view=rev
Log:
Add an option that allows one to "decode" the LSDA.
The LSDA is a bit difficult for the non-initiated to read. Even with comments,
it's not always clear what's going on. This wraps the ASM streamer in a class
that retains the LSDA and then emits a human-readable description of what's
going on in it.
So instead of having to make sense of:
Lexception1:
.byte 255
.byte 155
.byte 168
.space 1
.byte 3
.byte 26
Lset0 = Ltmp7-Leh_func_begin1
.long Lset0
Lset1 = Ltmp812-Ltmp7
.long Lset1
Lset2 = Ltmp913-Leh_func_begin1
.long Lset2
.byte 3
Lset3 = Ltmp812-Leh_func_begin1
.long Lset3
Lset4 = Leh_func_end1-Ltmp812
.long Lset4
.long 0
.byte 0
.byte 1
.byte 0
.byte 2
.byte 125
.long __ZTIi at GOTPCREL+4
.long __ZTIPKc at GOTPCREL+4
you can read this instead:
## Exception Handling Table: Lexception1
## @LPStart Encoding: omit
## @TType Encoding: indirect pcrel sdata4
## @TType Base: 40 bytes
## @CallSite Encoding: udata4
## @Action Table Size: 26 bytes
## Action 1:
## A throw between Ltmp7 and Ltmp812 jumps to Ltmp913 on an exception.
## For type(s): __ZTIi at GOTPCREL+4 __ZTIPKc at GOTPCREL+4
## Action 2:
## A throw between Ltmp812 and Leh_func_end1 does not have a landing pad.
Modified:
llvm/trunk/include/llvm/MC/MCStreamer.h
llvm/trunk/include/llvm/Target/TargetRegistry.h
llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
llvm/trunk/lib/MC/MCAsmStreamer.cpp
llvm/trunk/lib/Target/PTX/PTXMCAsmStreamer.cpp
llvm/trunk/lib/Target/PTX/PTXTargetMachine.cpp
llvm/trunk/tools/llvm-mc/llvm-mc.cpp
Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Fri Jun 17 15:35:21 2011
@@ -547,6 +547,9 @@
///
/// \param ShowInst - Whether to show the MCInst representation inline with
/// the assembly.
+ ///
+ /// \param DecodeLSDA - If true, emit comments that translates the LSDA into a
+ /// human readable format. Only usable with CFI.
MCStreamer *createAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
bool isVerboseAsm,
bool useLoc,
@@ -554,7 +557,8 @@
MCInstPrinter *InstPrint = 0,
MCCodeEmitter *CE = 0,
TargetAsmBackend *TAB = 0,
- bool ShowInst = false);
+ bool ShowInst = false,
+ bool DecodeLSDA = false);
/// createMachOStreamer - Create a machine code streamer which will generate
/// Mach-O format object files.
Modified: llvm/trunk/include/llvm/Target/TargetRegistry.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRegistry.h?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Target/TargetRegistry.h (original)
+++ llvm/trunk/include/llvm/Target/TargetRegistry.h Fri Jun 17 15:35:21 2011
@@ -47,7 +47,8 @@
MCInstPrinter *InstPrint,
MCCodeEmitter *CE,
TargetAsmBackend *TAB,
- bool ShowInst);
+ bool ShowInst,
+ bool DecodeLSDA);
/// Target - Wrapper for Target specific information.
///
@@ -100,7 +101,8 @@
MCInstPrinter *InstPrint,
MCCodeEmitter *CE,
TargetAsmBackend *TAB,
- bool ShowInst);
+ bool ShowInst,
+ bool DecodeLSDA);
private:
/// Next - The next registered target in the linked list, maintained by the
@@ -334,10 +336,11 @@
MCInstPrinter *InstPrint,
MCCodeEmitter *CE,
TargetAsmBackend *TAB,
- bool ShowInst) const {
+ bool ShowInst,
+ bool DecodeLSDA) const {
// AsmStreamerCtorFn is default to llvm::createAsmStreamer
return AsmStreamerCtorFn(Ctx, OS, isVerboseAsm, useLoc, useCFI,
- InstPrint, CE, TAB, ShowInst);
+ InstPrint, CE, TAB, ShowInst, DecodeLSDA);
}
/// @}
Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
+++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Fri Jun 17 15:35:21 2011
@@ -72,6 +72,8 @@
cl::desc("Show encoding in .s output"));
static cl::opt<bool> ShowMCInst("show-mc-inst", cl::Hidden,
cl::desc("Show instruction structure in .s output"));
+static cl::opt<bool> DecodeMCLSDA("decode-mc-lsda", cl::Hidden,
+ cl::desc("Print LSDA in human readable format in .s output"));
static cl::opt<bool> EnableMCLogging("enable-mc-api-logging", cl::Hidden,
cl::desc("Enable MC API logging"));
static cl::opt<bool> VerifyMachineCode("verify-machineinstrs", cl::Hidden,
@@ -152,7 +154,8 @@
hasMCUseCFI(),
InstPrinter,
MCE, TAB,
- ShowMCInst);
+ ShowMCInst,
+ DecodeMCLSDA);
AsmStreamer.reset(S);
break;
}
Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri Jun 17 15:35:21 2011
@@ -19,6 +19,7 @@
#include "llvm/MC/MCSymbol.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
@@ -33,8 +34,10 @@
namespace {
class MCAsmStreamer : public MCStreamer {
+protected:
formatted_raw_ostream &OS;
const MCAsmInfo &MAI;
+private:
OwningPtr<MCInstPrinter> InstPrinter;
OwningPtr<MCCodeEmitter> Emitter;
OwningPtr<TargetAsmBackend> AsmBackend;
@@ -1242,12 +1245,371 @@
EmitFrames(false);
}
+//===----------------------------------------------------------------------===//
+/// MCLSDADecoderAsmStreamer - This is identical to the MCAsmStreamer, but
+/// outputs a description of the LSDA in a human readable format.
+///
+namespace {
+
+class MCLSDADecoderAsmStreamer : public MCAsmStreamer {
+ const MCSymbol *PersonalitySymbol;
+ const MCSymbol *LSDASymbol;
+ bool InLSDA;
+ bool ReadingULEB128;
+
+ uint64_t BytesRead;
+ uint64_t ActionTableBytes;
+ uint64_t LSDASize;
+
+ SmallVector<char, 2> ULEB128Value;
+ std::vector<int64_t> LSDAEncoding;
+ std::vector<const MCExpr*> Assignments;
+
+ /// GetULEB128Value - A helper function to convert the value in the
+ /// ULEB128Value vector into a uint64_t.
+ uint64_t GetULEB128Value(SmallVectorImpl<char> &ULEB128Value) {
+ uint64_t Val = 0;
+ for (unsigned i = 0, e = ULEB128Value.size(); i != e; ++i)
+ Val |= (ULEB128Value[i] & 0x7F) << (7 * i);
+ return Val;
+ }
+
+ /// ResetState - Reset the state variables.
+ void ResetState() {
+ PersonalitySymbol = 0;
+ LSDASymbol = 0;
+ LSDASize = 0;
+ BytesRead = 0;
+ ActionTableBytes = 0;
+ InLSDA = false;
+ ReadingULEB128 = false;
+ ULEB128Value.clear();
+ LSDAEncoding.clear();
+ Assignments.clear();
+ }
+
+ void EmitEHTableDescription();
+
+ const char *DecodeDWARFEncoding(unsigned Encoding) {
+ switch (Encoding) {
+ case dwarf::DW_EH_PE_absptr: return "absptr";
+ case dwarf::DW_EH_PE_omit: return "omit";
+ case dwarf::DW_EH_PE_pcrel: return "pcrel";
+ case dwarf::DW_EH_PE_udata4: return "udata4";
+ case dwarf::DW_EH_PE_udata8: return "udata8";
+ case dwarf::DW_EH_PE_sdata4: return "sdata4";
+ case dwarf::DW_EH_PE_sdata8: return "sdata8";
+ case dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata4: return "pcrel udata4";
+ case dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata4: return "pcrel sdata4";
+ case dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata8: return "pcrel udata8";
+ case dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata8: return "pcrel sdata8";
+ case dwarf::DW_EH_PE_indirect|dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata4:
+ return "indirect pcrel udata4";
+ case dwarf::DW_EH_PE_indirect|dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata4:
+ return "indirect pcrel sdata4";
+ case dwarf::DW_EH_PE_indirect|dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_udata8:
+ return "indirect pcrel udata8";
+ case dwarf::DW_EH_PE_indirect|dwarf::DW_EH_PE_pcrel|dwarf::DW_EH_PE_sdata8:
+ return "indirect pcrel sdata8";
+ }
+
+ return "<unknown encoding>";
+ }
+public:
+ MCLSDADecoderAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
+ bool isVerboseAsm, bool useLoc, bool useCFI,
+ MCInstPrinter *printer, MCCodeEmitter *emitter,
+ TargetAsmBackend *asmbackend,
+ bool showInst)
+ : MCAsmStreamer(Context, os, isVerboseAsm, useLoc, useCFI,
+ printer, emitter, asmbackend, showInst) {
+ ResetState();
+ }
+ ~MCLSDADecoderAsmStreamer() {}
+
+ virtual void Finish() {
+ ResetState();
+ MCAsmStreamer::Finish();
+ }
+
+ virtual void EmitLabel(MCSymbol *Symbol) {
+ if (Symbol == LSDASymbol)
+ InLSDA = true;
+ MCAsmStreamer::EmitLabel(Symbol);
+ }
+ virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
+ if (InLSDA)
+ Assignments.push_back(Value);
+ MCAsmStreamer::EmitAssignment(Symbol, Value);
+ }
+ virtual void EmitIntValue(uint64_t Value, unsigned Size,
+ unsigned AddrSpace = 0);
+ virtual void EmitValueImpl(const MCExpr *Value, unsigned Size,
+ unsigned AddrSpace);
+ virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue,
+ unsigned AddrSpace);
+ virtual void EmitCFIPersonality(const MCSymbol *Sym, unsigned Encoding) {
+ PersonalitySymbol = Sym;
+ MCAsmStreamer::EmitCFIPersonality(Sym, Encoding);
+ }
+ virtual void EmitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
+ LSDASymbol = Sym;
+ MCAsmStreamer::EmitCFILsda(Sym, Encoding);
+ }
+};
+
+} // end anonymous namespace
+
+void MCLSDADecoderAsmStreamer::EmitIntValue(uint64_t Value, unsigned Size,
+ unsigned AddrSpace) {
+ if (!InLSDA)
+ return MCAsmStreamer::EmitIntValue(Value, Size, AddrSpace);
+
+ BytesRead += Size;
+
+ // We place the LSDA into the LSDAEncoding vector for later analysis. If we
+ // have a ULEB128, we read that in separate iterations through here and then
+ // get its value.
+ if (!ReadingULEB128) {
+ LSDAEncoding.push_back(Value);
+ int EncodingSize = LSDAEncoding.size();
+
+ if (EncodingSize == 1 || EncodingSize == 3) {
+ // The LPStart and TType encodings.
+ if (Value != dwarf::DW_EH_PE_omit) {
+ // The encoding is next and is a ULEB128 value.
+ ReadingULEB128 = true;
+ ULEB128Value.clear();
+ } else {
+ // The encoding was omitted. Put a 0 here as a placeholder.
+ LSDAEncoding.push_back(0);
+ }
+ } else if (EncodingSize == 5) {
+ // The next value is a ULEB128 value that tells us how long the call site
+ // table is -- where the start of the action tab
+ ReadingULEB128 = true;
+ ULEB128Value.clear();
+ }
+
+ InLSDA = (LSDASize == 0 || BytesRead < LSDASize);
+ } else {
+ // We're reading a ULEB128. Make it so!
+ assert(Size == 1 && "Non-byte representation of a ULEB128?");
+ ULEB128Value.push_back(Value);
+
+ if ((Value & 0x80) == 0) {
+ uint64_t Val = GetULEB128Value(ULEB128Value);
+ LSDAEncoding.push_back(Val);
+ ULEB128Value.clear();
+ ReadingULEB128 = false;
+
+ if (LSDAEncoding.size() == 4)
+ // The fourth value tells us where the bottom of the type table is.
+ LSDASize = BytesRead + LSDAEncoding[3];
+ else if (LSDAEncoding.size() == 6)
+ // The sixth value tells us where the start of the action table is.
+ ActionTableBytes = BytesRead;
+ }
+ }
+
+ MCAsmStreamer::EmitValueImpl(MCConstantExpr::Create(Value, getContext()),
+ Size, AddrSpace);
+
+ if (LSDASize != 0 && !InLSDA)
+ EmitEHTableDescription();
+}
+
+void MCLSDADecoderAsmStreamer::EmitValueImpl(const MCExpr *Value,
+ unsigned Size,
+ unsigned AddrSpace) {
+ if (InLSDA && LSDASize != 0) {
+ assert(BytesRead + Size <= LSDASize && "EH table too small!");
+
+ if (BytesRead > uint64_t(LSDAEncoding[5]) + ActionTableBytes)
+ // Insert the type values.
+ Assignments.push_back(Value);
+
+ LSDAEncoding.push_back(Assignments.size());
+ BytesRead += Size;
+ InLSDA = (LSDASize == 0 || BytesRead < LSDASize);
+ }
+
+ MCAsmStreamer::EmitValueImpl(Value, Size, AddrSpace);
+
+ if (LSDASize != 0 && !InLSDA)
+ EmitEHTableDescription();
+}
+
+void MCLSDADecoderAsmStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue,
+ unsigned AddrSpace) {
+ if (InLSDA && ReadingULEB128) {
+ for (uint64_t I = NumBytes; I != 0; --I)
+ ULEB128Value.push_back(FillValue);
+
+ BytesRead += NumBytes;
+
+ if ((FillValue & 0x80) == 0) {
+ uint64_t Val = GetULEB128Value(ULEB128Value);
+ LSDAEncoding.push_back(Val);
+ ULEB128Value.clear();
+ ReadingULEB128 = false;
+
+ if (LSDAEncoding.size() == 4)
+ // The fourth value tells us where the bottom of the type table is.
+ LSDASize = BytesRead + LSDAEncoding[3];
+ else if (LSDAEncoding.size() == 6)
+ // The sixth value tells us where the start of the action table is.
+ ActionTableBytes = BytesRead;
+ }
+ }
+
+ MCAsmStreamer::EmitFill(NumBytes, FillValue, AddrSpace);
+}
+
+/// EmitEHTableDescription - Emit a human readable version of the LSDA.
+void MCLSDADecoderAsmStreamer::EmitEHTableDescription() {
+ assert(LSDAEncoding.size() > 6 && "Invalid LSDA!");
+
+ // Emit header information.
+ StringRef C = MAI.getCommentString();
+#define CMT OS << C << ' '
+ CMT << "Exception Handling Table: " << LSDASymbol->getName() << "\n";
+ CMT << " @LPStart Encoding: " << DecodeDWARFEncoding(LSDAEncoding[0]) << "\n";
+ if (LSDAEncoding[1])
+ CMT << "@LPStart: 0x" << LSDAEncoding[1] << "\n";
+ CMT << " @TType Encoding: " << DecodeDWARFEncoding(LSDAEncoding[2]) << "\n";
+ CMT << " @TType Base: " << LSDAEncoding[3] << " bytes\n";
+ CMT << "@CallSite Encoding: " << DecodeDWARFEncoding(LSDAEncoding[4]) << "\n";
+ CMT << "@Action Table Size: " << LSDAEncoding[5] << " bytes\n\n";
+
+ bool isSjLjEH = (MAI.getExceptionHandlingType() == ExceptionHandling::ARM);
+
+ int64_t CallSiteTableSize = LSDAEncoding[5];
+ unsigned CallSiteEntrySize;
+ if (!isSjLjEH)
+ CallSiteEntrySize = 4 + // Region start.
+ 4 + // Region end.
+ 4 + // Landing pad.
+ 1; // TType index.
+ else
+ CallSiteEntrySize = 1 + // Call index.
+ 1 + // Landing pad.
+ 1; // TType index.
+
+ unsigned NumEntries = CallSiteTableSize / CallSiteEntrySize;
+ assert(CallSiteTableSize % CallSiteEntrySize == 0 &&
+ "The action table size is not a multiple of what it should be!");
+ unsigned TTypeIdx = 5 + // Action table size index.
+ (isSjLjEH ? 3 : 4) * NumEntries + // Action table entries.
+ 1; // Just because.
+
+ // Emit the action table.
+ unsigned Action = 1;
+ for (unsigned I = 6; I < TTypeIdx; ) {
+ CMT << "Action " << Action++ << ":\n";
+
+ // The beginning of the throwing region.
+ uint64_t Idx = LSDAEncoding[I++];
+
+ if (!isSjLjEH) {
+ CMT << " A throw between "
+ << *cast<MCBinaryExpr>(Assignments[Idx - 1])->getLHS() << " and ";
+
+ // The end of the throwing region.
+ Idx = LSDAEncoding[I++];
+ OS << *cast<MCBinaryExpr>(Assignments[Idx - 1])->getLHS();
+ } else {
+ CMT << " A throw from call " << *Assignments[Idx - 1];
+ }
+
+ // The landing pad.
+ Idx = LSDAEncoding[I++];
+ if (Idx) {
+ OS << " jumps to "
+ << *cast<MCBinaryExpr>(Assignments[Idx - 1])->getLHS()
+ << " on an exception.\n";
+ } else {
+ OS << " does not have a landing pad.\n";
+ ++I;
+ continue;
+ }
+
+ // The index into the action table.
+ Idx = LSDAEncoding[I++];
+ if (!Idx) {
+ CMT << " :cleanup:\n";
+ continue;
+ }
+
+ // A semi-graphical representation of what the different indexes are in the
+ // loop below.
+ //
+ // Idx - Index into the action table.
+ // Action - Index into the type table from the type table base.
+ // Next - Offset from Idx to the next action type.
+ //
+ // Idx---.
+ // |
+ // v
+ // [call site table] _1 _2 _3
+ // TTypeIdx--> .........................
+ // [action 1] _1 _2
+ // [action 2] _1 _2
+ // ...
+ // [action n] _1 _2
+ // [type m] ^
+ // ... |
+ // [type 1] `---Next
+ //
+
+ int Action = LSDAEncoding[TTypeIdx + Idx - 1];
+ if ((Action & 0x40) != 0)
+ // Ignore exception specifications.
+ continue;
+
+ // Emit the types that are caught by this exception.
+ CMT << " For type(s): ";
+ for (;;) {
+ if ((Action & 0x40) != 0)
+ // Ignore exception specifications.
+ break;
+
+ if (uint64_t Ty = LSDAEncoding[LSDAEncoding.size() - Action]) {
+ OS << " " << *Assignments[Ty - 1];
+
+ // Types can be chained together. Typically, it's a negative offset from
+ // the current type to a different one in the type table.
+ int Next = LSDAEncoding[TTypeIdx + Idx];
+ if (Next == 0)
+ break;
+ if ((Next & 0x40) != 0)
+ Next = (int)(signed char)(Next | 0x80);
+ Idx += Next + 1;
+ Action = LSDAEncoding[TTypeIdx + Idx - 1];
+ continue;
+ } else {
+ OS << " :catchall:";
+ }
+ break;
+ }
+
+ OS << "\n";
+ }
+
+ OS << "\n";
+ ResetState();
+}
+
MCStreamer *llvm::createAsmStreamer(MCContext &Context,
formatted_raw_ostream &OS,
bool isVerboseAsm, bool useLoc,
- bool useCFI,
- MCInstPrinter *IP, MCCodeEmitter *CE,
- TargetAsmBackend *TAB, bool ShowInst) {
+ bool useCFI, MCInstPrinter *IP,
+ MCCodeEmitter *CE, TargetAsmBackend *TAB,
+ bool ShowInst, bool DecodeLSDA) {
+ if (DecodeLSDA)
+ return new MCLSDADecoderAsmStreamer(Context, OS, isVerboseAsm, useLoc,
+ useCFI, IP, CE, TAB, ShowInst);
+
return new MCAsmStreamer(Context, OS, isVerboseAsm, useLoc, useCFI,
IP, CE, TAB, ShowInst);
}
Modified: llvm/trunk/lib/Target/PTX/PTXMCAsmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXMCAsmStreamer.cpp?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXMCAsmStreamer.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXMCAsmStreamer.cpp Fri Jun 17 15:35:21 2011
@@ -533,7 +533,8 @@
bool isVerboseAsm, bool useLoc, bool useCFI,
MCInstPrinter *IP,
MCCodeEmitter *CE, TargetAsmBackend *TAB,
- bool ShowInst) {
+ bool ShowInst,
+ bool /*DecodeLSDA*/) {
return new PTXMCAsmStreamer(Context, OS, isVerboseAsm, useLoc,
IP, CE, ShowInst);
}
Modified: llvm/trunk/lib/Target/PTX/PTXTargetMachine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PTX/PTXTargetMachine.cpp?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PTX/PTXTargetMachine.cpp (original)
+++ llvm/trunk/lib/Target/PTX/PTXTargetMachine.cpp Fri Jun 17 15:35:21 2011
@@ -27,7 +27,8 @@
MCInstPrinter *InstPrint,
MCCodeEmitter *CE,
TargetAsmBackend *TAB,
- bool ShowInst);
+ bool ShowInst,
+ bool DecodeLSDA);
}
extern "C" void LLVMInitializePTXTarget() {
Modified: llvm/trunk/tools/llvm-mc/llvm-mc.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mc/llvm-mc.cpp?rev=133286&r1=133285&r2=133286&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mc/llvm-mc.cpp (original)
+++ llvm/trunk/tools/llvm-mc/llvm-mc.cpp Fri Jun 17 15:35:21 2011
@@ -61,6 +61,10 @@
ShowInstOperands("show-inst-operands",
cl::desc("Show instructions operands as parsed"));
+static cl::opt<bool>
+DecodeLSDA("decode-lsda",
+ cl::desc("Print LSDA in human readable format"));
+
static cl::opt<unsigned>
OutputAsmVariant("output-asm-variant",
cl::desc("Syntax variant to use for output printing"));
@@ -97,7 +101,7 @@
static cl::opt<std::string>
ArchName("arch", cl::desc("Target arch to assemble for, "
- "see -version for available targets"));
+ "see -version for available targets"));
static cl::opt<std::string>
TripleName("triple", cl::desc("Target triple to assemble for, "
@@ -110,12 +114,11 @@
cl::init(""));
static cl::opt<bool>
-NoInitialTextSection("n", cl::desc(
- "Don't assume assembly file starts in the text section"));
+NoInitialTextSection("n", cl::desc("Don't assume assembly file starts "
+ "in the text section"));
static cl::opt<bool>
-SaveTempLabels("L", cl::desc(
- "Don't discard temporary labels"));
+SaveTempLabels("L", cl::desc("Don't discard temporary labels"));
enum ActionType {
AC_AsLex,
@@ -358,7 +361,8 @@
Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/true,
/*useLoc*/ true,
/*useCFI*/ true, IP, CE, TAB,
- ShowInst));
+ ShowInst,
+ DecodeLSDA));
} else if (FileType == OFT_Null) {
Str.reset(createNullStreamer(Ctx));
} else {
More information about the llvm-commits
mailing list