2010-04-08 11:33:12 +02:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
|
|
|
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
|
|
|
**
|
|
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
|
|
|
**
|
|
|
|
|
** Commercial Usage
|
|
|
|
|
**
|
|
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Nokia.
|
|
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
**
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
|
|
|
**
|
|
|
|
|
** If you are unsure which license is appropriate for your use, please
|
|
|
|
|
** contact the sales department at http://qt.nokia.com/contact.
|
|
|
|
|
**
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "ldparser.h"
|
|
|
|
|
#include "projectexplorerconstants.h"
|
|
|
|
|
#include "taskwindow.h"
|
|
|
|
|
|
|
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
// opt. drive letter + filename: (2 brackets)
|
2010-09-15 14:44:25 +02:00
|
|
|
const char * const FILE_PATTERN = "(([A-Za-z]:)?[^:]+\\.[^:]+):";
|
2010-04-08 11:33:12 +02:00
|
|
|
// line no. or elf segment + offset: (1 bracket)
|
|
|
|
|
const char * const POSITION_PATTERN = "(\\d+|\\(\\.[a-zA-Z0-9]*.0x[a-fA-F0-9]+\\)):";
|
|
|
|
|
const char * const COMMAND_PATTERN = "^(.*[\\\\/])?([a-z0-9]+-[a-z0-9]+-[a-z0-9]+-)?(ld|gold)(-[0-9\\.]+)?(\\.exe)?: ";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LdParser::LdParser()
|
|
|
|
|
{
|
2010-09-15 13:55:01 +02:00
|
|
|
setObjectName(QLatin1String("LdParser"));
|
2010-09-15 14:44:25 +02:00
|
|
|
m_regExpLinker.setPattern(QString('^') +
|
|
|
|
|
QString::fromLatin1(FILE_PATTERN) + '(' +
|
|
|
|
|
QString::fromLatin1(FILE_PATTERN) + ")?(" +
|
|
|
|
|
QLatin1String(POSITION_PATTERN) + ")?\\s(.+)$");
|
2010-04-08 11:33:12 +02:00
|
|
|
m_regExpLinker.setMinimal(true);
|
|
|
|
|
|
|
|
|
|
m_regExpGccNames.setPattern(COMMAND_PATTERN);
|
|
|
|
|
m_regExpGccNames.setMinimal(true);
|
|
|
|
|
|
|
|
|
|
m_regExpInFunction.setPattern("^In (static |member )*function ");
|
|
|
|
|
m_regExpInFunction.setMinimal(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void LdParser::stdError(const QString &line)
|
|
|
|
|
{
|
|
|
|
|
QString lne = line.trimmed();
|
|
|
|
|
if (lne.startsWith(QLatin1String("TeamBuilder ")) ||
|
|
|
|
|
lne.startsWith(QLatin1String("distcc["))) {
|
|
|
|
|
IOutputParser::stdError(line);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (lne.startsWith(QLatin1String("collect2:"))) {
|
|
|
|
|
emit addTask(Task(Task::Error,
|
|
|
|
|
lne /* description */,
|
|
|
|
|
QString() /* filename */,
|
|
|
|
|
-1 /* linenumber */,
|
|
|
|
|
Constants::TASK_CATEGORY_COMPILE));
|
|
|
|
|
return;
|
2010-04-12 15:15:12 +02:00
|
|
|
} else if (m_regExpGccNames.indexIn(lne) > -1) {
|
|
|
|
|
QString description = lne.mid(m_regExpGccNames.matchedLength());
|
|
|
|
|
Task task(Task::Error,
|
|
|
|
|
description,
|
|
|
|
|
QString(), /* filename */
|
|
|
|
|
-1, /* line */
|
|
|
|
|
Constants::TASK_CATEGORY_COMPILE);
|
|
|
|
|
if (description.startsWith(QLatin1String("warning: "))) {
|
|
|
|
|
task.type = Task::Warning;
|
|
|
|
|
task.description = description.mid(9);
|
|
|
|
|
} else if (description.startsWith(QLatin1String("fatal: "))) {
|
|
|
|
|
task.description = description.mid(7);
|
|
|
|
|
}
|
|
|
|
|
emit addTask(task);
|
|
|
|
|
return;
|
2010-04-08 11:33:12 +02:00
|
|
|
} else if (m_regExpLinker.indexIn(lne) > -1) {
|
|
|
|
|
bool ok;
|
2010-09-15 14:44:25 +02:00
|
|
|
int lineno = m_regExpLinker.cap(7).toInt(&ok);
|
2010-04-08 11:33:12 +02:00
|
|
|
if (!ok)
|
|
|
|
|
lineno = -1;
|
2010-09-15 14:44:25 +02:00
|
|
|
QString filename = m_regExpLinker.cap(1);
|
|
|
|
|
if (!m_regExpLinker.cap(4).isEmpty()
|
|
|
|
|
&& !m_regExpLinker.cap(4).startsWith(QLatin1String("(.text+0x")))
|
|
|
|
|
filename = m_regExpLinker.cap(4);
|
|
|
|
|
QString description = m_regExpLinker.cap(8).trimmed();
|
|
|
|
|
Task task(Task::Error, description, filename, lineno,
|
2010-04-08 11:33:12 +02:00
|
|
|
Constants::TASK_CATEGORY_COMPILE);
|
|
|
|
|
if (m_regExpInFunction.indexIn(description) > -1 ||
|
|
|
|
|
description.startsWith(QLatin1String("At global scope")) ||
|
2010-08-30 11:21:54 +02:00
|
|
|
description.startsWith(QLatin1String("At top level")) ||
|
2010-04-08 11:33:12 +02:00
|
|
|
description.startsWith(QLatin1String("instantiated from ")) ||
|
2010-04-16 12:41:38 +02:00
|
|
|
description.startsWith(QLatin1String("In ")))
|
2010-04-08 11:33:12 +02:00
|
|
|
task.type = Task::Unknown;
|
|
|
|
|
|
|
|
|
|
emit addTask(task);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
IOutputParser::stdError(line);
|
|
|
|
|
}
|