188181375SSunho Kim //===-- COFFDirectiveParser.cpp - JITLink coff directive parser --*- C++ -*===// 288181375SSunho Kim // 388181375SSunho Kim // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 488181375SSunho Kim // See https://llvm.org/LICENSE.txt for license information. 588181375SSunho Kim // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 688181375SSunho Kim // 788181375SSunho Kim //===----------------------------------------------------------------------===// 888181375SSunho Kim // 988181375SSunho Kim // MSVC COFF directive parser 1088181375SSunho Kim // 1188181375SSunho Kim //===----------------------------------------------------------------------===// 1288181375SSunho Kim 1388181375SSunho Kim #include "COFFDirectiveParser.h" 1488181375SSunho Kim 15d9ab3e82Sserge-sans-paille #include <array> 16d9ab3e82Sserge-sans-paille 1788181375SSunho Kim using namespace llvm; 1888181375SSunho Kim using namespace jitlink; 1988181375SSunho Kim 2088181375SSunho Kim #define DEBUG_TYPE "jitlink" 2188181375SSunho Kim 22*dd647e3eSChandler Carruth #define OPTTABLE_STR_TABLE_CODE 2388181375SSunho Kim #include "COFFOptions.inc" 24*dd647e3eSChandler Carruth #undef OPTTABLE_STR_TABLE_CODE 2588181375SSunho Kim 26*dd647e3eSChandler Carruth #define OPTTABLE_PREFIXES_TABLE_CODE 2707bb29d8Sserge-sans-paille #include "COFFOptions.inc" 28*dd647e3eSChandler Carruth #undef OPTTABLE_PREFIXES_TABLE_CODE 29*dd647e3eSChandler Carruth 30*dd647e3eSChandler Carruth #define OPTTABLE_PREFIXES_UNION_CODE 31*dd647e3eSChandler Carruth #include "COFFOptions.inc" 32*dd647e3eSChandler Carruth #undef OPTTABLE_PREFIXES_UNION_CODE 3307bb29d8Sserge-sans-paille 3488181375SSunho Kim // Create table mapping all options defined in COFFOptions.td 35dcb6d212SJustin Bogner using namespace llvm::opt; 3607d9ab9aSserge-sans-paille static constexpr opt::OptTable::Info infoTable[] = { 373f092f37SJan Svoboda #define OPTION(...) \ 383f092f37SJan Svoboda LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__), 3988181375SSunho Kim #include "COFFOptions.inc" 4088181375SSunho Kim #undef OPTION 4188181375SSunho Kim }; 4288181375SSunho Kim 4307bb29d8Sserge-sans-paille class COFFOptTable : public opt::PrecomputedOptTable { 4488181375SSunho Kim public: 45*dd647e3eSChandler Carruth COFFOptTable() 46*dd647e3eSChandler Carruth : PrecomputedOptTable(OptionStrTable, OptionPrefixesTable, infoTable, 47*dd647e3eSChandler Carruth OptionPrefixesUnion, true) {} 4888181375SSunho Kim }; 4988181375SSunho Kim 5088181375SSunho Kim static COFFOptTable optTable; 5188181375SSunho Kim 52ea75c258SSunho Kim Expected<opt::InputArgList> COFFDirectiveParser::parse(StringRef Str) { 5388181375SSunho Kim SmallVector<StringRef, 16> Tokens; 5488181375SSunho Kim SmallVector<const char *, 16> Buffer; 5588181375SSunho Kim cl::TokenizeWindowsCommandLineNoCopy(Str, saver, Tokens); 5688181375SSunho Kim for (StringRef Tok : Tokens) { 5788181375SSunho Kim bool HasNul = Tok.end() != Str.end() && Tok.data()[Tok.size()] == '\0'; 5888181375SSunho Kim Buffer.push_back(HasNul ? Tok.data() : saver.save(Tok).data()); 5988181375SSunho Kim } 6088181375SSunho Kim 6188181375SSunho Kim unsigned missingIndex; 6288181375SSunho Kim unsigned missingCount; 6388181375SSunho Kim 64ea75c258SSunho Kim auto Result = optTable.ParseArgs(Buffer, missingIndex, missingCount); 6588181375SSunho Kim 6688181375SSunho Kim if (missingCount) 6788181375SSunho Kim return make_error<JITLinkError>(Twine("COFF directive parsing failed: ") + 68ea75c258SSunho Kim Result.getArgString(missingIndex) + 6988181375SSunho Kim " missing argument"); 7088181375SSunho Kim LLVM_DEBUG({ 71ea75c258SSunho Kim for (auto *arg : Result.filtered(COFF_OPT_UNKNOWN)) 72ea75c258SSunho Kim dbgs() << "Unknown coff option argument: " << arg->getAsString(Result) 7388181375SSunho Kim << "\n"; 7488181375SSunho Kim }); 75067faddbSSunho Kim return std::move(Result); 7688181375SSunho Kim } 77