1c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar 234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===--- CommandLineSourceLoc.h - Parsing for source locations-*- C++ -*---===// 334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// 434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// The LLVM Compiler Infrastructure 534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// 634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source 734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// License. See LICENSE.TXT for details. 834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// 934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// 1134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// Command line parsing for source locations. 1234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis// 1334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 1534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#ifndef LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H 1634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#define LLVM_CLANG_FRONTEND_COMMANDLINESOURCELOC_H 1734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 18686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 1934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#include "llvm/Support/CommandLine.h" 206453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar#include "llvm/Support/raw_ostream.h" 2134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 2234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisnamespace clang { 2334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 2434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis/// \brief A source location that has been parsed on the command line. 2534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisstruct ParsedSourceLocation { 2634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis std::string FileName; 2734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis unsigned Line; 2834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis unsigned Column; 296453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar 306453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbarpublic: 316453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar /// Construct a parsed source location from a string; the Filename is empty on 326453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar /// error. 33686775deca8b8685eb90801495880e3abdd844c2Chris Lattner static ParsedSourceLocation FromString(StringRef Str) { 346453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar ParsedSourceLocation PSL; 35686775deca8b8685eb90801495880e3abdd844c2Chris Lattner std::pair<StringRef, StringRef> ColSplit = Str.rsplit(':'); 36686775deca8b8685eb90801495880e3abdd844c2Chris Lattner std::pair<StringRef, StringRef> LineSplit = 376453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar ColSplit.first.rsplit(':'); 386453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar 396453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar // If both tail splits were valid integers, return success. 406453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar if (!ColSplit.second.getAsInteger(10, PSL.Column) && 4190d9081cacb4b0163f2c7527f666d6515257067cDan Gohman !LineSplit.second.getAsInteger(10, PSL.Line)) { 426453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar PSL.FileName = LineSplit.first; 436453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar 4490d9081cacb4b0163f2c7527f666d6515257067cDan Gohman // On the command-line, stdin may be specified via "-". Inside the 4590d9081cacb4b0163f2c7527f666d6515257067cDan Gohman // compiler, stdin is called "<stdin>". 4690d9081cacb4b0163f2c7527f666d6515257067cDan Gohman if (PSL.FileName == "-") 4790d9081cacb4b0163f2c7527f666d6515257067cDan Gohman PSL.FileName = "<stdin>"; 4890d9081cacb4b0163f2c7527f666d6515257067cDan Gohman } 4990d9081cacb4b0163f2c7527f666d6515257067cDan Gohman 506453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar return PSL; 516453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar } 5234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis}; 5334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 5434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis} 5534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 5634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidisnamespace llvm { 5734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis namespace cl { 5834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis /// \brief Command-line option parser that parses source locations. 5934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis /// 6034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis /// Source locations are of the form filename:line:column. 6134d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis template<> 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump class parser<clang::ParsedSourceLocation> 6334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis : public basic_parser<clang::ParsedSourceLocation> { 6434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis public: 65c86804bc9c3f1953520b59084c9ad75104aba123Daniel Dunbar inline bool parse(Option &O, StringRef ArgName, StringRef ArgValue, 6634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis clang::ParsedSourceLocation &Val); 6734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis }; 6834d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool 7034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis parser<clang::ParsedSourceLocation>:: 7159b2172751e78ef7c0895d9a5d1359b61ab63a33Chris Lattner parse(Option &O, StringRef ArgName, StringRef ArgValue, 7234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis clang::ParsedSourceLocation &Val) { 7334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis using namespace clang; 7434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 756453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar Val = ParsedSourceLocation::FromString(ArgValue); 766453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar if (Val.FileName.empty()) { 776453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar errs() << "error: " 786453f72b8d2ecd85eaef3bf3184fc6db0da5525dDaniel Dunbar << "source location must be of the form filename:line:column\n"; 7934d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis return true; 8034d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis } 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8234d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis return false; 8334d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis } 8434d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis } 8534d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis} 8634d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis 8734d25d85d6abead0fa6337080449609a2a4f4404Argyrios Kyrtzidis#endif 88