forked from OSchip/llvm-project
Revert "[analyzer; alternate edges] don't add an edge incoming from the start of a function"
...and make this work correctly in the current codebase. After living on this for a while, it turns out to look very strange for inlined functions that have only a single statement, and somewhat strange for inlined functions in general (since they are still conceptually in the middle of the path, and there is a function-entry path note). It's worth noting that this only affects inlined functions; in the new arrow generation algorithm, the top-level function still starts at the first real statement in the function body, not the enclosing CompoundStmt. This reverts r182078 / dbfa950abe0e55b173286a306ee620eff5f72ea. llvm-svn: 182963
This commit is contained in:
parent
503276be05
commit
ca0ecb61e1
|
@ -1557,7 +1557,7 @@ static void addEdgeToPath(PathPieces &path,
|
|||
if (NewLocL.isInvalid() || NewLocL.isMacroID())
|
||||
return;
|
||||
|
||||
if (!PrevLoc.isValid()) {
|
||||
if (!PrevLoc.isValid() || !PrevLoc.asLocation().isValid()) {
|
||||
PrevLoc = NewLoc;
|
||||
return;
|
||||
}
|
||||
|
@ -1608,6 +1608,13 @@ GenerateAlternateExtensivePathDiagnostic(PathDiagnostic& PD,
|
|||
// call exit before this point. This means that the path
|
||||
// terminated within the call itself.
|
||||
if (Optional<CallEnter> CE = P.getAs<CallEnter>()) {
|
||||
// Add an edge to the start of the function.
|
||||
const StackFrameContext *CalleeLC = CE->getCalleeContext();
|
||||
const Decl *D = CalleeLC->getDecl();
|
||||
addEdgeToPath(PD.getActivePath(), PrevLoc,
|
||||
PathDiagnosticLocation::createBegin(D, SM),
|
||||
CalleeLC);
|
||||
|
||||
// Did we visit an entire call?
|
||||
bool VisitedEntireCall = PD.isWithinCall();
|
||||
PD.popActivePath();
|
||||
|
|
|
@ -8624,6 +8624,40 @@ void variousLoops(id input) {
|
|||
// CHECK-NEXT: <string>Entered call from 'mainPlusMain'</string>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>control</string>
|
||||
// CHECK-NEXT: <key>edges</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>start</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>313</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>1</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>313</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>4</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: <key>end</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>314</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>3</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>line</key><integer>314</integer>
|
||||
// CHECK-NEXT: <key>col</key><integer>5</integer>
|
||||
// CHECK-NEXT: <key>file</key><integer>0</integer>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: </array>
|
||||
// CHECK-NEXT: </dict>
|
||||
// CHECK-NEXT: <dict>
|
||||
// CHECK-NEXT: <key>kind</key><string>event</string>
|
||||
// CHECK-NEXT: <key>location</key>
|
||||
// CHECK-NEXT: <dict>
|
||||
|
|
Loading…
Reference in New Issue