1//===-- llvm-mc.cpp - Machine Code Hacking Driver -------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 169 unchanged lines hidden (view full) --- 178 OwningPtr<MemoryBuffer> BufferPtr; 179 if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { 180 errs() << ProgName << ": " << ec.message() << '\n'; 181 return 1; 182 } 183 MemoryBuffer *Buffer = BufferPtr.take(); 184 185 SourceMgr SrcMgr; |
186 |
187 // Tell SrcMgr about this buffer, which is what TGParser will pick up. 188 SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); |
189 |
190 // Record the location of the include directories so that the lexer can find 191 // it later. 192 SrcMgr.setIncludeDirs(IncludeDirs); 193 194 const Target *TheTarget = GetTarget(ProgName); 195 if (!TheTarget) 196 return 1; 197 --- 76 unchanged lines hidden (view full) --- 274 // Print the token string. 275 Out->os() << " (\""; 276 Out->os().write_escaped(Tok.getString()); 277 Out->os() << "\")\n"; 278 } 279 280 // Keep output if no errors. 281 if (Error == 0) Out->keep(); |
282 |
283 return Error; 284} 285 286static int AssembleInput(const char *ProgName) { 287 const Target *TheTarget = GetTarget(ProgName); 288 if (!TheTarget) 289 return 1; 290 291 OwningPtr<MemoryBuffer> BufferPtr; 292 if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { 293 errs() << ProgName << ": " << ec.message() << '\n'; 294 return 1; 295 } 296 MemoryBuffer *Buffer = BufferPtr.take(); |
297 |
298 SourceMgr SrcMgr; |
299 |
300 // Tell SrcMgr about this buffer, which is what the parser will pick up. 301 SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); |
302 |
303 // Record the location of the include directories so that the lexer can find 304 // it later. 305 SrcMgr.setIncludeDirs(IncludeDirs); |
306 307 |
308 llvm::OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(TripleName)); 309 assert(MAI && "Unable to create target asm info!"); |
310 |
311 // Package up features to be passed to target/subtarget 312 std::string FeaturesStr; 313 if (MCPU.size()) { 314 SubtargetFeatures Features; 315 Features.setCPU(MCPU); 316 FeaturesStr = Features.getString(); 317 } 318 --- 54 unchanged lines hidden (view full) --- 373 if (EnableLogging) { 374 Str.reset(createLoggingStreamer(Str.take(), errs())); 375 } 376 377 OwningPtr<MCAsmParser> Parser(createMCAsmParser(*TheTarget, SrcMgr, Ctx, 378 *Str.get(), *MAI)); 379 OwningPtr<TargetAsmParser> TAP(TheTarget->createAsmParser(*Parser, *TM)); 380 if (!TAP) { |
381 errs() << ProgName |
382 << ": error: this target does not support assembly parsing.\n"; 383 return 1; 384 } 385 386 Parser->setShowParsedOperands(ShowInstOperands); 387 Parser->setTargetParser(*TAP.get()); 388 389 int Res = Parser->Run(NoInitialTextSection); --- 9 unchanged lines hidden (view full) --- 399 if (!TheTarget) 400 return 0; 401 402 OwningPtr<MemoryBuffer> Buffer; 403 if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, Buffer)) { 404 errs() << ProgName << ": " << ec.message() << '\n'; 405 return 1; 406 } |
407 |
408 OwningPtr<tool_output_file> Out(GetOutputStream()); 409 if (!Out) 410 return 1; 411 412 int Res; 413 if (Enhanced) { 414 Res = 415 Disassembler::disassembleEnhanced(TripleName, *Buffer.take(), Out->os()); --- 38 unchanged lines hidden (view full) --- 454 455 // Initialize targets and assembly printers/parsers. 456 llvm::InitializeAllTargetInfos(); 457 // FIXME: We shouldn't need to initialize the Target(Machine)s. 458 llvm::InitializeAllTargets(); 459 llvm::InitializeAllAsmPrinters(); 460 llvm::InitializeAllAsmParsers(); 461 llvm::InitializeAllDisassemblers(); |
462 |
463 cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); 464 TripleName = Triple::normalize(TripleName); 465 466 switch (Action) { 467 default: 468 case AC_AsLex: 469 return AsLexInput(argv[0]); 470 case AC_Assemble: 471 return AssembleInput(argv[0]); 472 case AC_Disassemble: 473 return DisassembleInput(argv[0], false); 474 case AC_EDisassemble: 475 return DisassembleInput(argv[0], true); 476 } |
477 |
478 return 0; 479} 480 |