mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-15 15:48:38 +00:00
Validate the generated C++ code in llvmc tests.
Checks that the code generated by 'tblgen --emit-llvmc' can be actually compiled. Also fixes two bugs found in this way: - forward_transformed_value didn't work with non-list arguments - cl::ZeroOrOne is now called cl::Optional llvm-svn: 91404
This commit is contained in:
parent
d2373fd4dc
commit
93c8d86be9
@ -42,9 +42,9 @@ def hidden;
|
|||||||
def init;
|
def init;
|
||||||
def multi_val;
|
def multi_val;
|
||||||
def one_or_more;
|
def one_or_more;
|
||||||
|
def optional;
|
||||||
def really_hidden;
|
def really_hidden;
|
||||||
def required;
|
def required;
|
||||||
def zero_or_one;
|
|
||||||
def comma_separated;
|
def comma_separated;
|
||||||
|
|
||||||
// The 'case' construct.
|
// The 'case' construct.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// Check that the compilation graph can be empty.
|
// Check that the compilation graph can be empty.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// http://llvm.org/bugs/show_bug.cgi?id=4157
|
// http://llvm.org/bugs/show_bug.cgi?id=4157
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: not grep {)));} %t
|
// RUN: not grep {)));} %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// The dummy tool and graph are required to silence warnings.
|
// The dummy tool and graph are required to silence warnings.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep {extern .* AutoGeneratedSwitch_Wall} %t
|
// RUN: grep {extern .* AutoGeneratedSwitch_Wall} %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// http://llvm.org/bugs/show_bug.cgi?id=4159
|
// http://llvm.org/bugs/show_bug.cgi?id=4159
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep unique_name %t
|
// RUN: grep unique_name %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
// Check that forward_transformed_value works.
|
// Check that forward_transformed_value works.
|
||||||
// The dummy tool and graph are required to silence warnings.
|
// The dummy tool and graph are required to silence warnings.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep HookA %t
|
// RUN: grep HookA %t | count 2
|
||||||
// RUN: grep HookB %t
|
// RUN: grep HookB %t | count 2
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep {vec.push_back\(AutoGeneratedParameter_a\)} %t
|
// RUN: grep {vec.push_back\(AutoGeneratedParameter_a\)} %t
|
||||||
// RUN: grep {std::copy\(AutoGeneratedList_b.begin\(\)} %t
|
// RUN: grep {std::copy\(AutoGeneratedList_b.begin\(\)} %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
// RUN: grep "/path" %t | count 1
|
// RUN: grep "/path" %t | count 1
|
||||||
// RUN: grep "VARIABLE" %t | count 1
|
// RUN: grep "VARIABLE" %t | count 1
|
||||||
// RUN: grep "/2path" %t | count 1
|
// RUN: grep "/2path" %t | count 1
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// Check that a hook can be given $INFILE as an argument.
|
// Check that a hook can be given $INFILE as an argument.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep Hook\\(inFile.c_str\\(\\)\\) %t | count 1
|
// RUN: grep Hook\\(inFile.c_str\\(\\)\\) %t | count 1
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep cl::init(\\"some-string\\") %t | count 1
|
// RUN: grep cl::init(\\"some-string\\") %t | count 1
|
||||||
// RUN: grep cl::init(true) %t | count 1
|
// RUN: grep cl::init(true) %t | count 1
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// The dummy tool and graph are required to silence warnings.
|
// The dummy tool and graph are required to silence warnings.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep cl::multi_val(2) %t | count 1
|
// RUN: grep cl::multi_val(2) %t | count 1
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// Check that multiple compilation graphs are allowed.
|
// Check that multiple compilation graphs are allowed.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
// Check that tools without associated actions are accepted.
|
// Check that tools without associated actions are accepted.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s | grep dummy_tool
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
|
// RUN: grep dummy_tool %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
// Check that the compilation graph is not required.
|
// Check that the compilation graph is not required.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
// Check that (one_or_more) and (zero_or_one) properties work.
|
// Check that (one_or_more) and (zero_or_one) properties work.
|
||||||
// The dummy tool and graph are required to silence warnings.
|
// The dummy tool and graph are required to silence warnings.
|
||||||
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
|
||||||
// RUN: grep cl::ZeroOrOne %t | count 1
|
// RUN: grep cl::Optional %t | count 1
|
||||||
// RUN: grep cl::OneOrMore %t | count 1
|
// RUN: grep cl::OneOrMore %t | count 1
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
def OptList : OptionList<[
|
def OptList : OptionList<[
|
||||||
(prefix_list_option "foo", (one_or_more)),
|
(prefix_list_option "foo", (one_or_more)),
|
||||||
(parameter_list_option "baz", (zero_or_one))]>;
|
(parameter_list_option "baz", (optional))]>;
|
||||||
|
|
||||||
def dummy_tool : Tool<[
|
def dummy_tool : Tool<[
|
||||||
(cmd_line "dummy_cmd $INFILE"),
|
(cmd_line "dummy_cmd $INFILE"),
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
// RUN: grep W1 %t
|
// RUN: grep W1 %t
|
||||||
// RUN: grep W2 %t
|
// RUN: grep W2 %t
|
||||||
// RUN: grep W3 %t
|
// RUN: grep W3 %t
|
||||||
|
// RUN: %compile_cxx -fexceptions -x c++ %t
|
||||||
|
|
||||||
include "llvm/CompilerDriver/Common.td"
|
include "llvm/CompilerDriver/Common.td"
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Check that the compiler warns about unused options.
|
// Check that warnings about unused options are really emitted.
|
||||||
// This should fail because the output is printed on stderr.
|
// This should fail because the output is printed on stderr.
|
||||||
// RUN: ignore tblgen -I %p/../../include --gen-llvmc %s |& grep "option '-Wall' has no effect!"
|
// RUN: ignore tblgen -I %p/../../include --gen-llvmc %s |& grep "option '-Wall' has no effect!"
|
||||||
|
|
||||||
|
@ -336,8 +336,8 @@ separate option groups syntactically.
|
|||||||
it is synonymous with ``required``. Incompatible with ``required`` and
|
it is synonymous with ``required``. Incompatible with ``required`` and
|
||||||
``zero_or_one``.
|
``zero_or_one``.
|
||||||
|
|
||||||
- ``zero_or_one`` - the option can be specified zero or one times. Useful
|
- ``optional`` - the option can be specified zero or one times. Useful only
|
||||||
only for list options in conjunction with ``multi_val``. Incompatible with
|
for list options in conjunction with ``multi_val``. Incompatible with
|
||||||
``required`` and ``one_or_more``.
|
``required`` and ``one_or_more``.
|
||||||
|
|
||||||
- ``hidden`` - the description of this option will not appear in
|
- ``hidden`` - the description of this option will not appear in
|
||||||
@ -356,7 +356,7 @@ separate option groups syntactically.
|
|||||||
- ``multi_val n`` - this option takes *n* arguments (can be useful in some
|
- ``multi_val n`` - this option takes *n* arguments (can be useful in some
|
||||||
special cases). Usage example: ``(parameter_list_option "foo", (multi_val
|
special cases). Usage example: ``(parameter_list_option "foo", (multi_val
|
||||||
3))``; the command-line syntax is '-foo a b c'. Only list options can have
|
3))``; the command-line syntax is '-foo a b c'. Only list options can have
|
||||||
this attribute; you can, however, use the ``one_or_more``, ``zero_or_one``
|
this attribute; you can, however, use the ``one_or_more``, ``optional``
|
||||||
and ``required`` properties.
|
and ``required`` properties.
|
||||||
|
|
||||||
- ``init`` - this option has a default value, either a string (if it is a
|
- ``init`` - this option has a default value, either a string (if it is a
|
||||||
|
@ -211,7 +211,7 @@ OptionType::OptionType stringToOptionType(const std::string& T) {
|
|||||||
namespace OptionDescriptionFlags {
|
namespace OptionDescriptionFlags {
|
||||||
enum OptionDescriptionFlags { Required = 0x1, Hidden = 0x2,
|
enum OptionDescriptionFlags { Required = 0x1, Hidden = 0x2,
|
||||||
ReallyHidden = 0x4, Extern = 0x8,
|
ReallyHidden = 0x4, Extern = 0x8,
|
||||||
OneOrMore = 0x10, ZeroOrOne = 0x20,
|
OneOrMore = 0x10, Optional = 0x20,
|
||||||
CommaSeparated = 0x40 };
|
CommaSeparated = 0x40 };
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,8 +260,8 @@ struct OptionDescription {
|
|||||||
bool isOneOrMore() const;
|
bool isOneOrMore() const;
|
||||||
void setOneOrMore();
|
void setOneOrMore();
|
||||||
|
|
||||||
bool isZeroOrOne() const;
|
bool isOptional() const;
|
||||||
void setZeroOrOne();
|
void setOptional();
|
||||||
|
|
||||||
bool isHidden() const;
|
bool isHidden() const;
|
||||||
void setHidden();
|
void setHidden();
|
||||||
@ -331,11 +331,11 @@ void OptionDescription::setOneOrMore() {
|
|||||||
Flags |= OptionDescriptionFlags::OneOrMore;
|
Flags |= OptionDescriptionFlags::OneOrMore;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OptionDescription::isZeroOrOne() const {
|
bool OptionDescription::isOptional() const {
|
||||||
return Flags & OptionDescriptionFlags::ZeroOrOne;
|
return Flags & OptionDescriptionFlags::Optional;
|
||||||
}
|
}
|
||||||
void OptionDescription::setZeroOrOne() {
|
void OptionDescription::setOptional() {
|
||||||
Flags |= OptionDescriptionFlags::ZeroOrOne;
|
Flags |= OptionDescriptionFlags::Optional;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OptionDescription::isHidden() const {
|
bool OptionDescription::isHidden() const {
|
||||||
@ -548,7 +548,7 @@ public:
|
|||||||
AddHandler("one_or_more", &CollectOptionProperties::onOneOrMore);
|
AddHandler("one_or_more", &CollectOptionProperties::onOneOrMore);
|
||||||
AddHandler("really_hidden", &CollectOptionProperties::onReallyHidden);
|
AddHandler("really_hidden", &CollectOptionProperties::onReallyHidden);
|
||||||
AddHandler("required", &CollectOptionProperties::onRequired);
|
AddHandler("required", &CollectOptionProperties::onRequired);
|
||||||
AddHandler("zero_or_one", &CollectOptionProperties::onZeroOrOne);
|
AddHandler("optional", &CollectOptionProperties::onOptional);
|
||||||
AddHandler("comma_separated", &CollectOptionProperties::onCommaSeparated);
|
AddHandler("comma_separated", &CollectOptionProperties::onCommaSeparated);
|
||||||
|
|
||||||
staticMembersInitialized_ = true;
|
staticMembersInitialized_ = true;
|
||||||
@ -595,8 +595,8 @@ private:
|
|||||||
|
|
||||||
void onRequired (const DagInit* d) {
|
void onRequired (const DagInit* d) {
|
||||||
checkNumberOfArguments(d, 0);
|
checkNumberOfArguments(d, 0);
|
||||||
if (optDesc_.isOneOrMore() || optDesc_.isZeroOrOne())
|
if (optDesc_.isOneOrMore() || optDesc_.isOptional())
|
||||||
throw "Only one of (required), (zero_or_one) or "
|
throw "Only one of (required), (optional) or "
|
||||||
"(one_or_more) properties is allowed!";
|
"(one_or_more) properties is allowed!";
|
||||||
optDesc_.setRequired();
|
optDesc_.setRequired();
|
||||||
}
|
}
|
||||||
@ -617,8 +617,8 @@ private:
|
|||||||
|
|
||||||
void onOneOrMore (const DagInit* d) {
|
void onOneOrMore (const DagInit* d) {
|
||||||
checkNumberOfArguments(d, 0);
|
checkNumberOfArguments(d, 0);
|
||||||
if (optDesc_.isRequired() || optDesc_.isZeroOrOne())
|
if (optDesc_.isRequired() || optDesc_.isOptional())
|
||||||
throw "Only one of (required), (zero_or_one) or "
|
throw "Only one of (required), (optional) or "
|
||||||
"(one_or_more) properties is allowed!";
|
"(one_or_more) properties is allowed!";
|
||||||
if (!OptionType::IsList(optDesc_.Type))
|
if (!OptionType::IsList(optDesc_.Type))
|
||||||
llvm::errs() << "Warning: specifying the 'one_or_more' property "
|
llvm::errs() << "Warning: specifying the 'one_or_more' property "
|
||||||
@ -626,15 +626,15 @@ private:
|
|||||||
optDesc_.setOneOrMore();
|
optDesc_.setOneOrMore();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onZeroOrOne (const DagInit* d) {
|
void onOptional (const DagInit* d) {
|
||||||
checkNumberOfArguments(d, 0);
|
checkNumberOfArguments(d, 0);
|
||||||
if (optDesc_.isRequired() || optDesc_.isOneOrMore())
|
if (optDesc_.isRequired() || optDesc_.isOneOrMore())
|
||||||
throw "Only one of (required), (zero_or_one) or "
|
throw "Only one of (required), (optional) or "
|
||||||
"(one_or_more) properties is allowed!";
|
"(one_or_more) properties is allowed!";
|
||||||
if (!OptionType::IsList(optDesc_.Type))
|
if (!OptionType::IsList(optDesc_.Type))
|
||||||
llvm::errs() << "Warning: specifying the 'zero_or_one' property"
|
llvm::errs() << "Warning: specifying the 'optional' property"
|
||||||
"on a non-list option will have no effect.\n";
|
"on a non-list option will have no effect.\n";
|
||||||
optDesc_.setZeroOrOne();
|
optDesc_.setOptional();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onMultiVal (const DagInit* d) {
|
void onMultiVal (const DagInit* d) {
|
||||||
@ -1882,7 +1882,8 @@ class EmitActionHandlersCallback
|
|||||||
const OptionDescription& D = OptDescs.FindListOrParameter(Name);
|
const OptionDescription& D = OptDescs.FindListOrParameter(Name);
|
||||||
|
|
||||||
O.indent(IndentLevel) << "vec.push_back(" << "hooks::"
|
O.indent(IndentLevel) << "vec.push_back(" << "hooks::"
|
||||||
<< Hook << "(" << D.GenVariableName() << "));\n";
|
<< Hook << "(" << D.GenVariableName()
|
||||||
|
<< (D.isParameter() ? ".c_str()" : "") << "));\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2211,8 +2212,8 @@ void EmitOptionDefinitions (const OptionDescriptions& descs,
|
|||||||
else if (val.isOneOrMore() && val.isList()) {
|
else if (val.isOneOrMore() && val.isList()) {
|
||||||
O << ", cl::OneOrMore";
|
O << ", cl::OneOrMore";
|
||||||
}
|
}
|
||||||
else if (val.isZeroOrOne() && val.isList()) {
|
else if (val.isOptional() && val.isList()) {
|
||||||
O << ", cl::ZeroOrOne";
|
O << ", cl::Optional";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val.isReallyHidden())
|
if (val.isReallyHidden())
|
||||||
|
Loading…
Reference in New Issue
Block a user