xref: /llvm-project/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp (revision dd647e3e608ed0b2bac7c588d5859b80ef4a5976)
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