diff --git a/llvm/test/tools/yaml2obj/preprocess-only.test b/llvm/test/tools/yaml2obj/preprocess-only.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/yaml2obj/preprocess-only.test @@ -0,0 +1,16 @@ +# RUN: yaml2obj -E -Dfoo=wibble %s | FileCheck %s + +This is a test of yaml2obj's pure preprocessing mode, so it doesn't +have to contain valid YAML, or any YAML at all. But we do have to be +careful with the FileCheck CHECK directives, because they'll be +emitted into the preprocessed output, and risk matching themselves! +For that reason, each one matches only at the start of a line. + +Expand a macro: +[[foo]] # CHECK: {{^wibble}} + +Expand an undefined macro: +[[bar]] # CHECK: {{^\[\[bar\]\]}} + +Expand an undefined macro where we provided a default value: +[[baz=123]] # CHECK: {{^123}} diff --git a/llvm/tools/yaml2obj/yaml2obj.cpp b/llvm/tools/yaml2obj/yaml2obj.cpp --- a/llvm/tools/yaml2obj/yaml2obj.cpp +++ b/llvm/tools/yaml2obj/yaml2obj.cpp @@ -40,6 +40,9 @@ "definition. The syntax is ="), cl::cat(Cat)); +cl::opt PreprocessOnly("E", cl::desc("Just print the preprocessed file"), + cl::cat(Cat)); + cl::opt DocNum("docnum", cl::init(1), cl::desc("Read specified document from input (default = 1)"), @@ -133,11 +136,16 @@ Optional Buffer = preprocess(Buf.get()->getBuffer(), ErrHandler); if (!Buffer) return 1; - yaml::Input YIn(*Buffer); - if (!convertYAML(YIn, Out->os(), ErrHandler, DocNum, - MaxSize == 0 ? UINT64_MAX : MaxSize)) - return 1; + if (PreprocessOnly) { + Out->os() << Buffer; + } else { + yaml::Input YIn(*Buffer); + + if (!convertYAML(YIn, Out->os(), ErrHandler, DocNum, + MaxSize == 0 ? UINT64_MAX : MaxSize)) + return 1; + } Out->keep(); Out->os().flush();