Verifying weak memory concurrent data structure implementations