summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-06-21 17:39:32 -0400
committerGitHub <noreply@github.com>2019-06-21 17:39:32 -0400
commit714b0881974965e8fcfbc57b452ef648290d14a1 (patch)
treef283fb216113a9517686acf49ca436512500b4cb /tools
parent64eec046f5a77ebad9564a935c4fad8df08ea6eb (diff)
Parsing CPP Compiler output (#994)
* Added extractLine line parsing to StringUtil. Use for matching lines instead of calcLines. calcLines uses extractLine to extract lines. Fixed problems found in output of some tests- due to how a how final line is handled. Now a final line has a \r or \n\r combination, but nothing else after it, it is considered the last line (not the line after it). * Use StringUtil::extractLine in slang-generate. * Improved comment on extractLine * Remove test code from StringUtil::extractLine * Made StringUtil::extractLine act as if line terminators are 'separators'. Added unit-test-string.cpp - to check behavior. * Adding LineParser - not entirely necessary, but slightly easier to use. * Hack to output start of tests. * WIP parsing CPPCompiler output. * Make extractLine return a bool. * First attempt at Visual Studio output parsing. * Add handling for checking error returning from CPPCompiler. * First pass parsing output of Gcc/Clang. * Split out VisualStudioCompilerUtil and GCCCompilerUtil. Simplified parsing of versions. * Simplify CPPCompiler::Output interface. * Fix problem with cpp-compiler on linux targets. * Add shared library link error. * Improving GCC/Clang parsing output. * Make cpp compiler parsing function able to return a SlangResult. * Handling for 'info' on clang * Add expected result for c-compile-shared-library-error.c * * Add flags such that link errors on shared libraries are supported. * Added StringUtil::join * Turn off the link shared library unfound symbol option on MacOS because it causes an error (and it's not needed on that target). * Add natvis inclusion back to visual studio projects. * Display message to try and determine crash problem on travisbuild. * Fix bug in handling continuations for clang. Disabled output of exception text. * WIP: See what clang is outputting that is parsing incorrectly on travis. * More handling for travis clang parsing issue. * Restore natvis to core.vcxproj * Fix visual studio project such that it still as natvis.
Diffstat (limited to 'tools')
-rw-r--r--tools/slang-test/slang-test-main.cpp118
-rw-r--r--tools/slang-test/unit-test-string.cpp31
2 files changed, 119 insertions, 30 deletions
diff --git a/tools/slang-test/slang-test-main.cpp b/tools/slang-test/slang-test-main.cpp
index 6eae194e6..0543dd067 100644
--- a/tools/slang-test/slang-test-main.cpp
+++ b/tools/slang-test/slang-test-main.cpp
@@ -1086,6 +1086,20 @@ String getExpectedOutput(String const& outputStem)
return expectedOutput;
}
+static String _calcSummary(const CPPCompiler::Output& inOutput)
+{
+ CPPCompiler::Output output(inOutput);
+
+ // We only want to analyse errors for now
+ output.removeByType(CPPCompiler::OutputMessage::Type::Info);
+ output.removeByType(CPPCompiler::OutputMessage::Type::Warning);
+
+ StringBuilder builder;
+
+ output.appendSimplifiedSummary(builder);
+ return builder;
+}
+
static TestResult runCPPCompilerExecute(TestContext* context, TestInput& input)
{
CPPCompilerSet* compilerSet = context->getCPPCompilerSet();
@@ -1131,15 +1145,23 @@ static TestResult runCPPCompilerExecute(TestContext* context, TestInput& input)
options.sourceFiles.add(filePath);
options.modulePath = modulePath;
- ExecuteResult exeRes;
-
- if (SLANG_FAILED(compiler->compile(options, exeRes)))
+ CPPCompiler::Output output;
+ if (SLANG_FAILED(compiler->compile(options, output)))
{
return TestResult::Fail;
}
- // Execute the binary and see what we get
+ String actualOutput;
+
+ // If the actual compilation failed, then the output will be
+ if (SLANG_FAILED(output.result))
+ {
+ actualOutput = _calcSummary(output);
+ }
+ else
{
+ // Execute the binary and see what we get
+
CommandLine cmdLine;
StringBuilder exePath;
@@ -1154,9 +1176,14 @@ static TestResult runCPPCompilerExecute(TestContext* context, TestInput& input)
}
// Write the output, and compare to expected
- String actualOutput = getOutput(exeRes);
- Slang::File::writeAllText(actualOutputPath, actualOutput);
+ actualOutput = getOutput(exeRes);
+ }
+
+ // Write the output
+ Slang::File::writeAllText(actualOutputPath, actualOutput);
+ // Check that they are the same
+ {
// Read the expected
String expectedOutput;
try
@@ -1226,43 +1253,74 @@ static TestResult runCPPCompilerSharedLibrary(TestContext* context, TestInput& i
options.includePaths.add(".");
- ExecuteResult exeRes;
-
- if (SLANG_FAILED(compiler->compile(options, exeRes)))
+ CPPCompiler::Output output;
+ if (SLANG_FAILED(compiler->compile(options, output)))
{
return TestResult::Fail;
}
- SharedLibrary::Handle handle;
- if (SLANG_FAILED(SharedLibrary::loadWithPlatformPath(sharedLibraryPath.getBuffer(), handle)))
+ if (SLANG_FAILED(output.result))
{
- return TestResult::Fail;
- }
-
- const int inValue = 10;
- const char inBuffer[] = "Hello World!";
+ // Compilation failed
+ String actualOutput = _calcSummary(output);
- char buffer[128] = "";
- int value = 0;
+ // Write the output
+ Slang::File::writeAllText(actualOutputPath, actualOutput);
- typedef int (*TestFunc)(int intValue, const char* textValue, char* outTextValue);
+ // Check that they are the same
+ {
+ // Read the expected
+ String expectedOutput;
+ try
+ {
+ String expectedOutputPath = outputStem + ".expected";
+ expectedOutput = Slang::File::readAllText(expectedOutputPath);
+ }
+ catch (Slang::IOException)
+ {
+ }
- // We could capture output if we passed in a ISlangWriter - but for that to work we'd need a
- TestFunc testFunc = (TestFunc)SharedLibrary::findFuncByName(handle, "test");
- if (testFunc)
- {
- value = testFunc(inValue, inBuffer, buffer);
+ // Compare if they are the same
+ if (!StringUtil::areLinesEqual(actualOutput.getUnownedSlice(), expectedOutput.getUnownedSlice()))
+ {
+ context->reporter->dumpOutputDifference(expectedOutput, actualOutput);
+ return TestResult::Fail;
+ }
+ }
}
else
{
- printf("Unable to access 'test' function\n");
- }
+ SharedLibrary::Handle handle;
+ if (SLANG_FAILED(SharedLibrary::loadWithPlatformPath(sharedLibraryPath.getBuffer(), handle)))
+ {
+ return TestResult::Fail;
+ }
- SharedLibrary::unload(handle);
+ const int inValue = 10;
+ const char inBuffer[] = "Hello World!";
- if (!(inValue == value && strcmp(inBuffer, buffer) == 0))
- {
- return TestResult::Fail;
+ char buffer[128] = "";
+ int value = 0;
+
+ typedef int (*TestFunc)(int intValue, const char* textValue, char* outTextValue);
+
+ // We could capture output if we passed in a ISlangWriter - but for that to work we'd need a
+ TestFunc testFunc = (TestFunc)SharedLibrary::findFuncByName(handle, "test");
+ if (testFunc)
+ {
+ value = testFunc(inValue, inBuffer, buffer);
+ }
+ else
+ {
+ printf("Unable to access 'test' function\n");
+ }
+
+ SharedLibrary::unload(handle);
+
+ if (!(inValue == value && strcmp(inBuffer, buffer) == 0))
+ {
+ return TestResult::Fail;
+ }
}
return TestResult::Pass;
diff --git a/tools/slang-test/unit-test-string.cpp b/tools/slang-test/unit-test-string.cpp
index 5811a4a64..d585132c8 100644
--- a/tools/slang-test/unit-test-string.cpp
+++ b/tools/slang-test/unit-test-string.cpp
@@ -72,6 +72,37 @@ static void stringUnitTest()
SLANG_CHECK(_checkLineParser(UnownedStringSlice::fromLiteral("\n")));
SLANG_CHECK(_checkLineParser(UnownedStringSlice::fromLiteral("")));
}
+ {
+ Int value;
+ SLANG_CHECK(SLANG_SUCCEEDED(StringUtil::parseInt(UnownedStringSlice("-10"), value)) && value == -10);
+ SLANG_CHECK(SLANG_SUCCEEDED(StringUtil::parseInt(UnownedStringSlice("0"), value)) && value == 0);
+ SLANG_CHECK(SLANG_SUCCEEDED(StringUtil::parseInt(UnownedStringSlice("-0"), value)) && value == 0);
+
+ SLANG_CHECK(SLANG_SUCCEEDED(StringUtil::parseInt(UnownedStringSlice("13824"), value)) && value == 13824);
+ SLANG_CHECK(SLANG_SUCCEEDED(StringUtil::parseInt(UnownedStringSlice("-13824"), value)) && value == -13824);
+ }
+
+ {
+ UnownedStringSlice values[] = { UnownedStringSlice("hello"), UnownedStringSlice("world"), UnownedStringSlice("!") };
+
+ StringBuilder builder;
+ builder.Clear();
+ StringUtil::join(values, 0, ',', builder);
+ SLANG_CHECK(builder == "");
+
+ builder.Clear();
+ StringUtil::join(values, 1, ',', builder);
+ SLANG_CHECK(builder == "hello");
+
+
+ builder.Clear();
+ StringUtil::join(values, 2, ',', builder);
+ SLANG_CHECK(builder == "hello,world");
+
+ builder.Clear();
+ StringUtil::join(values, 3, UnownedStringSlice("ab"), builder);
+ SLANG_CHECK(builder == "helloabworldab!");
+ }
}
SLANG_UNIT_TEST("String", stringUnitTest);