summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/tools/llvm-mc/llvm-mc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/tools/llvm-mc/llvm-mc.cpp')
-rw-r--r--gnu/llvm/tools/llvm-mc/llvm-mc.cpp117
1 files changed, 97 insertions, 20 deletions
diff --git a/gnu/llvm/tools/llvm-mc/llvm-mc.cpp b/gnu/llvm/tools/llvm-mc/llvm-mc.cpp
index 00f19cb328c..497fb198776 100644
--- a/gnu/llvm/tools/llvm-mc/llvm-mc.cpp
+++ b/gnu/llvm/tools/llvm-mc/llvm-mc.cpp
@@ -66,8 +66,7 @@ CompressDebugSections("compress-debug-sections", cl::ValueOptional,
clEnumValN(DebugCompressionType::DCT_Zlib, "zlib",
"Use zlib compression"),
clEnumValN(DebugCompressionType::DCT_ZlibGnu, "zlib-gnu",
- "Use zlib-gnu compression (depricated)"),
- clEnumValEnd));
+ "Use zlib-gnu compression (deprecated)")));
static cl::opt<bool>
ShowInst("show-inst", cl::desc("Show internal instruction representation"));
@@ -105,8 +104,7 @@ FileType("filetype", cl::init(OFT_AssemblyFile),
clEnumValN(OFT_Null, "null",
"Don't emit anything (for timing purposes)"),
clEnumValN(OFT_ObjectFile, "obj",
- "Emit a native object ('.o') file"),
- clEnumValEnd));
+ "Emit a native object ('.o') file")));
static cl::list<std::string>
IncludeDirs("I", cl::desc("Directory of include files"),
@@ -148,8 +146,7 @@ CMModel("code-model",
clEnumValN(CodeModel::Medium, "medium",
"Medium code model"),
clEnumValN(CodeModel::Large, "large",
- "Large code model"),
- clEnumValEnd));
+ "Large code model")));
static cl::opt<bool>
NoInitialTextSection("n", cl::desc("Don't assume assembly file starts "
@@ -190,8 +187,7 @@ Action(cl::desc("Action to perform:"),
clEnumValN(AC_Disassemble, "disassemble",
"Disassemble strings of hex bytes"),
clEnumValN(AC_MDisassemble, "mdis",
- "Marked up disassembly of strings of hex bytes"),
- clEnumValEnd));
+ "Marked up disassembly of strings of hex bytes")));
static const Target *GetTarget(const char *ProgName) {
// Figure out the target triple.
@@ -314,6 +310,78 @@ static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI,
case AsmToken::Slash: OS << "Slash"; break;
case AsmToken::Star: OS << "Star"; break;
case AsmToken::Tilde: OS << "Tilde"; break;
+ case AsmToken::PercentCall16:
+ OS << "PercentCall16";
+ break;
+ case AsmToken::PercentCall_Hi:
+ OS << "PercentCall_Hi";
+ break;
+ case AsmToken::PercentCall_Lo:
+ OS << "PercentCall_Lo";
+ break;
+ case AsmToken::PercentDtprel_Hi:
+ OS << "PercentDtprel_Hi";
+ break;
+ case AsmToken::PercentDtprel_Lo:
+ OS << "PercentDtprel_Lo";
+ break;
+ case AsmToken::PercentGot:
+ OS << "PercentGot";
+ break;
+ case AsmToken::PercentGot_Disp:
+ OS << "PercentGot_Disp";
+ break;
+ case AsmToken::PercentGot_Hi:
+ OS << "PercentGot_Hi";
+ break;
+ case AsmToken::PercentGot_Lo:
+ OS << "PercentGot_Lo";
+ break;
+ case AsmToken::PercentGot_Ofst:
+ OS << "PercentGot_Ofst";
+ break;
+ case AsmToken::PercentGot_Page:
+ OS << "PercentGot_Page";
+ break;
+ case AsmToken::PercentGottprel:
+ OS << "PercentGottprel";
+ break;
+ case AsmToken::PercentGp_Rel:
+ OS << "PercentGp_Rel";
+ break;
+ case AsmToken::PercentHi:
+ OS << "PercentHi";
+ break;
+ case AsmToken::PercentHigher:
+ OS << "PercentHigher";
+ break;
+ case AsmToken::PercentHighest:
+ OS << "PercentHighest";
+ break;
+ case AsmToken::PercentLo:
+ OS << "PercentLo";
+ break;
+ case AsmToken::PercentNeg:
+ OS << "PercentNeg";
+ break;
+ case AsmToken::PercentPcrel_Hi:
+ OS << "PercentPcrel_Hi";
+ break;
+ case AsmToken::PercentPcrel_Lo:
+ OS << "PercentPcrel_Lo";
+ break;
+ case AsmToken::PercentTlsgd:
+ OS << "PercentTlsgd";
+ break;
+ case AsmToken::PercentTlsldm:
+ OS << "PercentTlsldm";
+ break;
+ case AsmToken::PercentTprel_Hi:
+ OS << "PercentTprel_Hi";
+ break;
+ case AsmToken::PercentTprel_Lo:
+ OS << "PercentTprel_Lo";
+ break;
}
// Print the token string.
@@ -325,22 +393,22 @@ static int AsLexInput(SourceMgr &SrcMgr, MCAsmInfo &MAI,
return Error;
}
-static int fillCommandLineSymbols(MCAsmParser &Parser){
- for(auto &I: DefineSymbol){
+static int fillCommandLineSymbols(MCAsmParser &Parser) {
+ for (auto &I: DefineSymbol) {
auto Pair = StringRef(I).split('=');
- if(Pair.second.empty()){
- errs() << "error: defsym must be of the form: sym=value: " << I;
+ auto Sym = Pair.first;
+ auto Val = Pair.second;
+
+ if (Sym.empty() || Val.empty()) {
+ errs() << "error: defsym must be of the form: sym=value: " << I << "\n";
return 1;
}
int64_t Value;
- if(Pair.second.getAsInteger(0, Value)){
- errs() << "error: Value is not an integer: " << Pair.second;
+ if (Val.getAsInteger(0, Value)) {
+ errs() << "error: Value is not an integer: " << Val << "\n";
return 1;
}
- auto &Context = Parser.getContext();
- auto Symbol = Context.getOrCreateSymbol(Pair.first);
- Parser.getStreamer().EmitAssignment(Symbol,
- MCConstantExpr::create(Value, Context));
+ Parser.getContext().setSymbolValue(Parser.getStreamer(), Sym, Value);
}
return 0;
}
@@ -495,6 +563,14 @@ int main(int argc, char **argv) {
IP = TheTarget->createMCInstPrinter(Triple(TripleName), OutputAsmVariant,
*MAI, *MCII, *MRI);
+ if (!IP) {
+ errs()
+ << "error: unable to create instruction printer for target triple '"
+ << TheTriple.normalize() << "' with assembly variant "
+ << OutputAsmVariant << ".\n";
+ return 1;
+ }
+
// Set the display preference for hex vs. decimal immediates.
IP->setPrintImmHex(PrintImmHex);
@@ -503,7 +579,7 @@ int main(int argc, char **argv) {
MCAsmBackend *MAB = nullptr;
if (ShowEncoding) {
CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);
- MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU);
+ MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU, MCOptions);
}
auto FOut = llvm::make_unique<formatted_raw_ostream>(*OS);
Str.reset(TheTarget->createAsmStreamer(
@@ -524,7 +600,8 @@ int main(int argc, char **argv) {
}
MCCodeEmitter *CE = TheTarget->createMCCodeEmitter(*MCII, *MRI, Ctx);
- MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU);
+ MCAsmBackend *MAB = TheTarget->createMCAsmBackend(*MRI, TripleName, MCPU,
+ MCOptions);
Str.reset(TheTarget->createMCObjectStreamer(
TheTriple, Ctx, *MAB, *OS, CE, *STI, MCOptions.MCRelaxAll,
MCOptions.MCIncrementalLinkerCompatible,