Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp
35271 views
//===-- COFFDirectiveParser.cpp - JITLink coff directive parser --*- C++ -*===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// MSVC COFF directive parser9//10//===----------------------------------------------------------------------===//1112#include "COFFDirectiveParser.h"1314#include <array>1516using namespace llvm;17using namespace jitlink;1819#define DEBUG_TYPE "jitlink"2021// Create prefix string literals used in Options.td22#define PREFIX(NAME, VALUE) \23static constexpr StringLiteral NAME##_init[] = VALUE; \24static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \25std::size(NAME##_init) - 1);26#include "COFFOptions.inc"27#undef PREFIX2829static constexpr const StringLiteral PrefixTable_init[] =30#define PREFIX_UNION(VALUES) VALUES31#include "COFFOptions.inc"32#undef PREFIX_UNION33;34static constexpr const ArrayRef<StringLiteral>35PrefixTable(PrefixTable_init, std::size(PrefixTable_init) - 1);3637// Create table mapping all options defined in COFFOptions.td38using namespace llvm::opt;39static constexpr opt::OptTable::Info infoTable[] = {40#define OPTION(...) \41LLVM_CONSTRUCT_OPT_INFO_WITH_ID_PREFIX(COFF_OPT_, __VA_ARGS__),42#include "COFFOptions.inc"43#undef OPTION44};4546class COFFOptTable : public opt::PrecomputedOptTable {47public:48COFFOptTable() : PrecomputedOptTable(infoTable, PrefixTable, true) {}49};5051static COFFOptTable optTable;5253Expected<opt::InputArgList> COFFDirectiveParser::parse(StringRef Str) {54SmallVector<StringRef, 16> Tokens;55SmallVector<const char *, 16> Buffer;56cl::TokenizeWindowsCommandLineNoCopy(Str, saver, Tokens);57for (StringRef Tok : Tokens) {58bool HasNul = Tok.end() != Str.end() && Tok.data()[Tok.size()] == '\0';59Buffer.push_back(HasNul ? Tok.data() : saver.save(Tok).data());60}6162unsigned missingIndex;63unsigned missingCount;6465auto Result = optTable.ParseArgs(Buffer, missingIndex, missingCount);6667if (missingCount)68return make_error<JITLinkError>(Twine("COFF directive parsing failed: ") +69Result.getArgString(missingIndex) +70" missing argument");71LLVM_DEBUG({72for (auto *arg : Result.filtered(COFF_OPT_UNKNOWN))73dbgs() << "Unknown coff option argument: " << arg->getAsString(Result)74<< "\n";75});76return std::move(Result);77}787980