Chromium Code Reviews| Index: src/llvm2ice.cpp |
| diff --git a/src/llvm2ice.cpp b/src/llvm2ice.cpp |
| index 3546b84c87bfacfc63c77f757103f0fd2ca225df..dc7c65a7e59a7d010235986af1e5bf2f8ca42648 100644 |
| --- a/src/llvm2ice.cpp |
| +++ b/src/llvm2ice.cpp |
| @@ -16,6 +16,7 @@ |
| #include <fstream> |
| #include <iostream> |
| +#include "llvm/ADT/STLExtras.h" |
| #include "llvm/IR/LLVMContext.h" |
| #include "llvm/IRReader/IRReader.h" |
| #include "llvm/Support/CommandLine.h" |
| @@ -161,12 +162,58 @@ static cl::opt<bool> AlwaysExitSuccess( |
| "exit-success", cl::desc("Exit with success status, even if errors found"), |
| cl::init(false)); |
| +static cl::opt<bool> GenerateBuildAtts( |
| + "build-atts", cl::desc("Generate list of build attributes associated with " |
| + "this executable."), |
| + cl::init(false)); |
| + |
| static int GetReturnValue(int Val) { |
| if (AlwaysExitSuccess) |
| return 0; |
| return Val; |
| } |
| +static struct { |
| + const char *FlagName; |
| + int FlagValue; |
| +} ConditionalBuildAttributes[] = { |
| + { "text_asm", ALLOW_TEXT_ASM }, |
| + { "dump", ALLOW_DUMP }, |
| + { "llvm_cl", ALLOW_LLVM_CL }, |
| + { "llvm_ir", ALLOW_LLVM_IR }, |
| + { "llvm_ir_as_input", ALLOW_LLVM_IR_AS_INPUT } |
| +}; |
| + |
| +// Validates values of build attributes. Prints them to Stream if |
| +// Stream is non-null. |
| +static void ValidateAndGenerateBuildAttributes(raw_os_ostream *Stream) { |
| + |
| + // TODO(kschimpf): Conditionalize this once we have multiple targets. |
|
Jim Stichnoth
2014/10/21 21:58:41
After the GlobalContext object is created, you cou
Karl
2014/10/22 17:03:36
Done.
|
| + if (Stream) |
| + *Stream << "x86-32\n"; |
| + |
| + for (size_t i = 0; i < array_lengthof(ConditionalBuildAttributes); ++i) { |
| + switch (ConditionalBuildAttributes[i].FlagValue) { |
| + case 0: |
| + if (Stream) |
| + *Stream << "no_" << ConditionalBuildAttributes[i].FlagName << "\n"; |
| + break; |
| + case 1: |
| + if (Stream) |
| + *Stream << "allow_" << ConditionalBuildAttributes[i].FlagName << "\n"; |
| + break; |
| + default: { |
| + std::string Buffer; |
| + raw_string_ostream StrBuf(Buffer); |
| + StrBuf << "Flag " << ConditionalBuildAttributes[i].FlagName |
| + << " must be defined as 0/1. Found: " |
| + << ConditionalBuildAttributes[i].FlagValue; |
| + report_fatal_error(StrBuf.str()); |
| + } |
| + } |
| + } |
| +} |
| + |
| int main(int argc, char **argv) { |
| cl::ParseCommandLineOptions(argc, argv); |
| @@ -182,6 +229,11 @@ int main(int argc, char **argv) { |
| raw_os_ostream *Os = |
| new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs); |
| Os->SetUnbuffered(); |
| + |
| + ValidateAndGenerateBuildAttributes(GenerateBuildAtts ? Os : nullptr); |
| + if (GenerateBuildAtts) |
| + return GetReturnValue(0); |
| + |
| std::ofstream Lfs; |
| if (LogFilename != "-") { |
| Lfs.open(LogFilename.c_str(), std::ofstream::out); |